2010-03-27 24 views

risposta

12

È 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.

+6

Le costanti 'public static final' sono da un momento precedente a' enum'. :) – Bombe

+5

@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

+6

Sì, certo, perché l'ultima volta che ho controllato 'Math' non era un'interfaccia. – Bombe

2

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.).

+1

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

+0

@Tedil: il set di funzionalità C# 4.0 è stato finalizzato. Non include le enumerazioni OO avanzate. – missingfaktor

5

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.

0

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.