2015-07-16 14 views
7

Quando sto cercando di compilare il seguente codicePerché il campo `statico privato 'non è consentito nell'interfaccia Java 8?

public interface SomeInterface{ 
    private static Logger logger = Logger.getLogger(); 

    public default void someMethod(){ 
     logger.info("someMethod: default implementation"); 
    } 
} 

ottengo un errore

Illegal modifier for the interface field SomeInterface.logger; only public, static & final are permitted 

Quando elimino private modificatore, il codice compila, ma non voglio che altre classi del pacchetto per vedere questo campo.

Perché Java non mi consente di fare una cosa del genere quando effettivamente ha senso?

+0

E se si sostituisce il metodo someMethod? – Stultuske

+0

@Stultuske Fornirò una nuova implementazione. Cosa succede se non lo sovrascrivo? – kamil09875

+0

Logicamente parlando, le interfacce sono pensate per fornire un modo per generalizzare il comportamento di diverse classi differenti. Questo è ciò che l'utente deve fare per controllare il comportamento di quella classe. Prendi una macchina (nella vita reale) per esempio: hai una ruota, una radio, freni, frizione, ecc. Sai di quelli e impari come farli funzionare. Ma se l'interfaccia include qualcosa a cui non hai accesso, come utilizzerai questo per controllare il comportamento della classe? In altre parole, le interfacce sono la tua porta di accesso al mondo: usale per generalizzare non nascondere campi, ecc ... – Mackiavelli

risposta

11

Nella vista pre-Java-8 del mondo, le interfacce erano puramente per i contratti di interfaccia e i membri privati ​​esistono puramente per l'implementazione, quindi questa limitazione era completamente ragionevole.

Nel mondo post-Java-8, in cui le interfacce possono trasportare il comportamento (ma non lo stato), inizia a essere ragionevole chiedersi se altre funzionalità delle classi dovrebbero essere applicate anche alle interfacce. (Tuttavia, solo perché qualcosa potrebbe essere "ragionevole" non significa che debba essere supportato, spesso esiste più di un modo ragionevole per costruire il mondo.)

In Java 9, saranno supportati metodi privati ​​nelle interfacce.

+0

questa risposta spiega la mia domanda il meglio :) avete qualche riferimento ai membri 'private' in Java 9? – kamil09875

+1

kamil09875: http://openjdk.java.net/jeps/213 (punto 5); se pensi che questo risponda alla tua domanda, puoi [accettare] (http://stackoverflow.com/help/accepted-answer) la risposta. – Holger

+0

"In Java 9, i membri privati ​​nelle interfacce saranno supportati" - Sembra che solo i metodi _private_ siano supportati, ma non _private i campi finali statici_? Avete qualche informazione sul perché i campi finali statici privati ​​sono stati omessi? – Balder

7

Le interfacce non sono classi. Non hanno uno stato privato. Anche un logger pubblico nell'interfaccia è un odore di design e un abuso di interfacce.

Il caso d'uso per i campi statici nelle interfacce è principalmente per le costanti in fase di compilazione, non per gli oggetti stateful.

+2

Non è se usato correttamente, che fornisce metodi di convenienza in termini di API propria dell'interfaccia. L'implementazione di default –

2

L'obiettivo dell'interfaccia è definire qualcosa implementato da altre classi. Un campo privato non definisce nulla in quanto non è visibile all'esterno dell'interfaccia. Quindi non ha alcun senso in questo costrutto. Potrebbero esserci alcuni hack come usarlo (forse dalle classi interne dell'interfaccia) ma non sarebbe comunque un buon progetto.

Se si implementa parte della funzionalità, utilizzare invece la classe astratta.

+0

non è visibile all'esterno dell'interfaccia – kamil09875

+0

Visibile nello stesso pacchetto. – h22

+0

come è visibile nello stesso pacchetto? anche le interfacce di Java 8 sono diverse perché in realtà implementano parte della funzionalità. Se non fosse un campo statico privato non sarebbe affatto necessario – kamil09875

1

L'interfaccia è come un progetto di qualsiasi classe, in cui dichiari i membri. Qualsiasi classe che implementa quell'interfaccia è responsabile della sua definizione. È possibile accedere ai membri privati ​​solo da membri della stessa classe, il che non ha senso in termini di interfaccia. I membri protetti possono accedere allo stesso membro della classe e ai membri della classe ereditati, ma in caso di interfaccia non estendiamo mai un'interfaccia, la implementiamo. Quindi qualsiasi interfaccia può contenere solo metodi pubblici in genere,

Problemi correlati