Perché una variabile utilizzata in un'interfaccia è PUBBLICA STATICA FINALE? Perché "statico" in particolare?Variabili nell'interfaccia
risposta
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.
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
@Jon Skeet Great .. Ma non lo stavo implementando praticamente! – Sandeep
@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 :) –
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.
Perché non dovrebbe essere statico?
È una costante associata all'interfaccia, piuttosto che a una sua particolare istanza.
classe astratta può avere istanza? – UnKnown
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).
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)
- 1. variabili variabili in PHP
- 2. Bash - variabili variabili
- 3. Java supporta variabili variabili?
- 4. PowerShell Variabili globali variabili locali
- 5. accesso variabili variabili nidificate in ansible
- 6. Variabili Android (get) variabili ambientali in Java
- 7. Come posso usare ddply con variabili variabili?
- 8. Variabili di istanza Java vs variabili locali
- 9. Rails - Variabili locali contro variabili di istanza
- 10. Cos'è un uso effettivo di variabili variabili?
- 11. Variabili variabili PHP con chiave di array
- 12. Variabili Xcode
- 13. Variabili multiple
- 14. variabili eclipse.ini
- 15. variabili concatenare
- 16. variabili “var”, "Questo" variabili e variabili "globali" - all'interno di un costruttore JavaScript
- 17. Valori predefiniti di variabili di istanza e variabili locali
- 18. Condivisione delle variabili tra i web worker? [variabili globali?]
- 19. variabili di istanza della classe python e variabili di classe
- 20. Variabili/escape di variabili nel corpo della posta
- 21. Variabili di istanza rispetto a variabili di classe in Python
- 22. C++ sovrapporre le variabili e le variabili mucchio
- 23. Ottenere NaN quando si aggiungono variabili costituite da altre variabili
- 24. Equivalente C equivalente a "Variabili variabili" di PHP
- 25. Codifica One-Hot in [R] | Variabili categoriali a variabili fittizie
- 26. Creazione di variabili categoriali da variabili dummy mutuamente esclusive
- 27. Quale è più veloce? Costanti, variabili o array di variabili
- 28. Le variabili di istanza sono le nuove variabili globali?
- 29. Variabili mutabili vs variabili in termini di cattura
- 30. R elenco da variabili che utilizzano nomi variabili
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. –
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