2011-01-01 6 views
11

Le interfacce private sono mai state utilizzate nelle decisioni di progettazione? Se sì, quali sono i motivi e quando conosci la necessità di un'interfaccia privata?Decisioni di progettazione: perché e quando rendere un'interfaccia privata?

+0

quando l'interfaccia riguarda qualcosa che deve essere estratto da tutto il codice che non si trova in un pacchetto specifico? – thejh

+3

Solo un'interfaccia può essere privata se si tratta di un'interfaccia nidificata. Una classe o un'interfaccia di classe può essere pubblica o privata. – Mot

risposta

3

IMHO Non è possibile rendere l'interfaccia privata.

Tuttavia, spesso ho due interfacce, una per uso pubblico e una per uso interno. L'interfaccia per uso interno I rende il pacchetto locale se possibile, ad es.

public interface MyInterface { 
    public void publicMethod(); 
} 

interface DirectMyInterface extends MyInterface { 
    public void internalUseOnlyMethod(); 
} 

I metodi per uso interno esporre metodi che non voglio altri sviluppatori di utilizzare e/o voglio essere in grado di cambiare facilmente. La ragione per cui ho l'interfaccia è che ho diverse implementazioni che voglio usare internamente tramite un'interfaccia.

+2

Per quale scopo è necessario il pacchetto uso interno? In oltre 10 anni di esperienza in Java non sono mai arrivato a questo schema, ma tu dici di usarlo ** spesso **. – Mot

+2

Scrivo spesso librerie o framework usati da altri sviluppatori. Voglio mantenere le interfacce il più semplici possibile, quindi tutti i metodi che posso nascondere lo faccio esp. se non sono destinati ad essere utilizzati da altri sviluppatori. –

1

Deve essere protetto da pacchetto se l'interfaccia è per uso interno. In generale se l'interfaccia non ha alcun interesse al di fuori del suo ambito è una buona decisione di progettazione api to hide it perché c'è meno complessità per gli utenti dell'interfaccia e consente anche di rifattorizzarlo più facilmente, perché quando l'interfaccia è pubblica e nel API si perde la libertà di cambiarlo.

4

A L'interfaccia di primo livello non può essere privata. Può avere solo public o l'accesso al pacchetto. Dalle Java Language Specification, section 9.1.1: "Interface Modifiers":

l'accesso modificatori protette e private riferiscono solo alle interfacce membri le cui dichiarazioni sono direttamente racchiuso da una dichiarazione di classe (§8.5.1).

A nidificata interfaccia può essere private ogniqualvolta e le sue sottoclassi, se presenti, sono un dettaglio esecuzione del suo classe di livello.

Ad esempio, l'interfaccia nidificata CLibrary di seguito viene utilizzata come dettaglio di implementazione della classe di livello superiore. Viene utilizzato esclusivamente per definire un'API per JNA, comunicata tramite l'interfaccia Class.

Come altro esempio, questa interfaccia privata definisce un'API utilizzata da classi nidificate private che implementano simboli di formattazione personalizzati.

public class FooFormatter { 
    private interface IFormatPart { 
     /** Formats a part of Foo, or text. 
     * @param foo Non-null foo object, which may be used as input. 
     */ 
     void write(Foo foo) throws IOException; 
    } 

    private class FormatSymbol implements IFormatPart { ... } 

    private class FormatText implements IFormatPart { ... } 

    ... 
} 
+0

Mi piace il tuo secondo esempio. –

+0

@JordanStewart - Grazie. È un esempio molto semplificato di un codice del mondo reale. –

Problemi correlati