2009-12-07 6 views
8

Perché una variabile utilizzata in un'interfaccia è PUBBLICA STATICA FINALE? Perché "statico" in particolare?Variabili nell'interfaccia

+0

Ho letto in un libro un po 'indietro che è meglio creare una variabile di un'interfaccia come myInterface myVarible = new myInterface(); che usare una classe perché è più facile mantenere la strada. Come sarebbe questo il caso. –

+0

Possibile duplicato di [Perché le variabili di interfaccia sono statiche e definitive per impostazione predefinita?] (Http://stackoverflow.com/questions/2430756/why-are-interface-variables-static-and-final-by-default) – Line

risposta

20

Un campo dichiarato in un'interfaccia può essere solo una costante in ogni caso, quindi perché dovrebbe dipendere dall'istanza utilizzata per accedervi?

Inserire i campi nelle interfacce è spesso di scarsa qualità in ogni caso. L'interfaccia è pensata per riflettere le capacità delle classi che la implementano - che è completamente ortogonale all'idea di una costante. È certamente una brutta idea utilizzare un'interfaccia solo per dichiarare un gruppo di costanti. Occasionalmente trovo utile che il tipo di interfaccia esponga delle costanti che sono semplici implementazioni - per cui un'interfaccia di filtraggio potrebbe avere campi "ALLOW_ALL" e "ALLOW_NONE", per esempio.

Suppongo che si possa concepire di uno scenario in cui l'attuazione di un interfaccia ha in realtà aggiungere un campo di istanza per la classe - ma che sarebbe rompere l'incapsulamento non solo in termini di esso essendo implicitamente pubblico, ma anche specificando parte dell'implementazione anziché dell'API.

+3

I parametri costanti statici non sono validi nel loro insieme, al giorno d'oggi, la sostituzione di un gruppo di costanti con Enum è attualmente il modo Java corretto, dato che è estremamente tipologico, funziona con gli switch e può essere codificato per includere più valori (utili) ad una costante essenzialmente evitando ripetizioni numeri magici. – Esko

+0

@Jon Skeet Great .. Ma non lo stavo implementando praticamente! – Sandeep

+0

@Esko: le enumerazioni sono appropriate in * alcuni * casi, ma certamente non coprono il caso * ogni * in cui si desiderano le costanti. In particolare, le enumerazioni sono appropriate solo laddove esiste un insieme fisso di valori. Ad esempio, sarebbe bello avere "costanti" di Charset per UTF-8 e gli altri set di caratteri garantiti, ma non vorrai renderlo un enum. Non cercare di far sembrare tutto un chiodo solo perché hai il enum hammer :) –

6

Perché non è possibile creare un'istanza di un'interfaccia. Inoltre non ci può essere alcun corpo del metodo per utilizzare una variabile non-finale non statica.

3

Perché non dovrebbe essere statico?

È una costante associata all'interfaccia, piuttosto che a una sua particolare istanza.

+0

classe astratta può avere istanza? – UnKnown

3

La ragione principale per cui indovino sono i dettagli di implementazione della VM/lingua.

Se un'interfaccia non può contenere variabili non statiche, non è necessario allocare memoria per l'interfaccia durante la creazione della classe. Non sono inoltre necessari speciali meccanismi di denominazione/ridenominazione nel caso in cui vengano ereditate variabili con lo stesso nome. L'unica cosa di cui hai bisogno è una tabella per chiamare le funzioni corrette quando viene utilizzata l'interfaccia.

In breve, rende più semplice la vita del manutentore della lingua/VM. Se vuoi davvero dare un'occhiata all'ereditarietà multipla e alle sue trappole e trappole, leggi Object Oriented Software Construction di Bertrand Meyer (2nd Edition). Quindi capisci perché l'interfaccia deve essere così semplice (eppure archivia la maggior parte delle cose che fa l'ereditarietà multipla).

2

Un'interfaccia è un contratto che definisce l'interazione tra oggetti.

Questa interazione è definita dai metodi esposti, non dalle variabili. Le variabili descrivono solo il funzionamento interno, non l'interazione.

Si noti che le variabili non devono mai essere utilizzate per l'interazione. Secondo il principio OOP di incapsulamento, sarebbe un crimine consentire a 1 classe di accedere direttamente a una variabile di un'altra classe.

Le costanti (ad esempio Math.PI) sono l'unica eccezione accettabile. Poiché le costanti sono le uniche variabili a cui è possibile accedere direttamente da altre classi senza violare il principio di incapsulamento, tutte le variabili in un'interfaccia vengono considerate come variabili public static final (ad es.costanti)

Problemi correlati