Tra interfacce ed enumerazioni, che è meglio per la dichiarazione delle costanti? Perché è così?Interfacce e enumerazioni
risposta
È sempre meglio utilizzare Enums per dichiarare le costanti in quanto l'obiettivo delle interfacce è su un livello completamente diverso. Sì, ci sono molte interfacce con costanti public static final
, ma ritengo che il lavoro esclusivo di enumerazione sia quello di fornire queste costanti.
Le interfacce sono progettate per definire comportamenti comuni, enumerazioni per definire valori comuni.
Enum rappresenta un valore reale che può essere confrontato con un altro valore o memorizzato nel database facilmente. Puoi anche avere un enumerazione di flag (in C#, non so in Java) che ti permette di eseguire operazioni binarie sui valori di enum (AND, OR, XOR, ecc.).
Nelle enumerazioni Java sono fondamentalmente (costanti) le classi, quindi puoi fare molto di più con loro che con enum in C# prima di .net 4.0. Penso che C#/.net 4.0 stia implementando questa funzione. – Tedil
@Tedil: il set di funzionalità C# 4.0 è stato finalizzato. Non include le enumerazioni OO avanzate. – missingfaktor
Se c'è un motivo per le costanti di avere un tipo specifico, se hanno bisogno di un qualche tipo di comportamento (cioè metodi), o se sono compositi di altri valori, enum
s sono la strada da percorrere.
Per esempio, supponiamo che si sta implementando un gioco di carte e si vuole rappresentare i valori e costumi:
enum Rank {
ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN,
EIGHT, NINE, TEN, JACK, QUEEN, KING;
}
enum Suit { SPADES, CLUBS, DIAMONDS, HEARTS }
lì, è ormai impossibile creare carte con abiti falsi o ranghi.
A volte, tuttavia, sei solo interessato ad avere un gruppo di valori usati frequentemente dichiarati da qualche parte. In tal caso, metterli in uno enum
sarebbe solo uno sforzo inutile, dal momento che queste costanti sono solo uno strumento per salvarci dal ricordare tutti i decimali di, diciamo, π quando calcoliamo la circonferenza di un cerchio o qualcosa del genere. Quale sembra migliore?
// Using enum:
enum MathConstant {
PI(3.14159265358979323846), E(2.7182818284590452354);
private final double value;
MathConstant(double v) { value = v; }
public double value() { return value; }
}
// Usage:
double circumference = MathConstant.PI.value() * diameter;
// Using a constant class:
final class MathConstants {
private MathConstants() { throw new UnsupportedOperationException(); }
public static final double PI = 3.14159265358979323846,
E = 2.7182818284590452354;
}
// Usage:
double circumference = MathConstants.PI * diameter;
Come per le interfacce: non inserire mai costanti in un'interfaccia. Il modello "interfaccia costante" non è valido (justification) e l'unico argomento per utilizzarlo è stato reso non valido poiché import static
è stato aggiunto a Java.
Se lavori con Java 5 o versioni successive, Enum è la strada da percorrere. L'unica eccezione è se la tua lista di const è aperta e può essere estesa. Le enumerazioni non possono essere estese. Un'altra eccezione è se si tratta di valori singoli come MAX_INTEGER.
- 1. Discrepanza tra Eclipse compilatore e javac - enumerazioni, interfacce e generici
- 2. Trattare con enumerazioni quando le interfacce sono in progetto separato
- 3. enumerazioni e annotazioni
- 4. enumerazioni e annotazione Android intDef
- 5. WSDL, enumerazioni e C#: E 'ancora oscuro
- 6. interfacce gerarchiche e implementazioni
- 7. DTO e interfacce
- 8. PHP Namespace e interfacce
- 9. Interfacce e proprietà F #
- 10. interfacce generiche e polimorfismo
- 11. Interfacce e proprietà
- 12. Interfacce e metodi asincroni
- 13. Differenze tra le enumerazioni scala e java
- 14. C# Enumerazioni e valori duplicati - pericoli?
- 15. collegamento di enumerazioni e enum classi
- 16. PHPUnit, interfacce deriso, e instanceof
- 17. WCF: Interfacce, Generics e ServiceKnownType
- 18. Interfacce, delegati e protocolli Objective
- 19. Come confrontare classi e interfacce?
- 20. Covariance con C# e Interfacce
- 21. Interfacce generiche e non generiche
- 22. EJB3 Interfacce locali e remote
- 23. C# generici e interfacce e semplice OO
- 24. Passaggio di enum tramite le interfacce aidl
- 25. C# Accendere enumerazioni
- 26. Alternativa alle enumerazioni
- 27. Scala match/compare enumerazioni
- 28. Generazione enumerazioni dinamicamente
- 29. Dove definire le enumerazioni
- 30. generazione di enumerazioni casuali
Le costanti 'public static final' sono da un momento precedente a' enum'. :) – Bombe
@Bombe, non è del tutto vero. Se, per esempio, "java.lang.Math" dovesse essere riscritto oggi, "PI" e "E" sarebbero comunque dichiarati come costanti "double statico finale pubblico". – gustafc
Sì, certo, perché l'ultima volta che ho controllato 'Math' non era un'interfaccia. – Bombe