2013-05-23 7 views
9

Sto leggendo Java efficace scritto da Joshua Bloch pubblicato nel 2008 e un consiglio è di sostituire i costrutti enum con le classi. Ecco l'esempio mostrato dal libro.Sostituisce i costrutti enum con le classi in Java ancora rilevanti?

public class Suit { 
    private final String name; 
    public Suit(String name) { this.name = name; } 
    public String toString() { return name; } 
    public static final Suit CLUBS = new Suit("clubs"); 
    public static final Suit DIAMONDS = new Suit("diamonds"); 
    public static final Suit HEARTS = new Suit("hearts"); 
    public static final Suit SPADES = new Suit("spades"); 
} 

La mia domanda è dato Java ora supporta tipo enum, è ancora una buona idea di utilizzare l'approccio di cui sopra? Ecco un esempio di tipo enum Java.

public enum Day { 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
} 
+0

enumerazioni in Java sono classi. – FDinoff

+0

Per la funzionalità di base enum-like non c'è motivo di non usare il semplice 'enum's. Ci sono alcune piccole modifiche avanzate che non puoi fare con enumerazioni in cui il pattern enum sicuro dal tipo può ancora essere applicato. –

+0

Leggi la 2a edizione del libro, ne vale davvero la pena, perché copre le nuove funzionalità Java. –

risposta

10

Il libro "Effective Java" è stato scritto ben prima dell'introduzione del enum s nella lingua, quindi mi consiglia di utilizzare la funzione enum invece. Fortunatamente, Java enum s sono molto versatili, in modo da poter seguire il consiglio di Joshua abbastanza da vicino utilizzando la funzione enum:

public enum Day { 
    SUNDAY("Sunday", 0) 
, MONDAY("Monday", 1) 
, TUESDAY("Tuesday", 2) 
, WEDNESDAY("Wednesday", 3) 
, THURSDAY("Thursday", 4) 
, FRIDAY("Friday", 5) 
, SATURDAY("Saturday", 6); 

    private String name; 
    private int ordinal; 
    public String getName() { return name; } 
    public int getOrdinal() { return ordinal; } 
    public Day(String name, int ordinal) { 
     this.name = name; 
     this.ordinal = ordinal; 
    } 
} 
+0

Anche gli EnumSet sono un costrutto utile. – wmorrison365

+6

Vale la pena notare che la seconda edizione copre l'uso di enumerazioni. – Jonathan

+0

Grazie a dasblinkenlight, il tuo esempio è molto utile. – beyonddc

2

Penso che l'idea è esattamente opposto. Se hai una struttura simile a enum, usa enum.

Il tuo esempio di classe non è esattamente adatto all'enum che hai scritto. Innanzitutto, non può essere compilato perché contiene diversi campi denominati CLUBS. Secondo, enum contiene giorni che non sono menzionati nella tua classe.

+0

oops! Hai colto il mio errore di battitura. – beyonddc

0

Per quanto ne so, java compila enum-s su oggetti public static final. È possibile controllare questo visualizzando i file enum. Class con javap (http://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javap.html).

+0

Questo è corretto, ma questo non risponde alla domanda. –

+0

Mostra che entrambi gli approcci sono equivalenti. – mrak

+0

solo se il codice sorgente non ha importanza e direi che la fonte è molto importante. –