2010-03-23 18 views
37

Sembra essere possibile in Java per scrivere qualcosa del genere:toString Uitvoeringsbesluit enumerazioni Java

private enum TrafficLight { 
    RED, 
    GREEN; 

    public String toString() { 
    return //what should I return here if I want to return 
           //"abc" when red and "def" when green? 
    } 
} 

Ora, vorrei sapere se è possibile returnin il metodo toString "abc" quando l'enum di il valore è rosso e "def" quando è verde. Inoltre, è possibile fare come in C#, dove si può fare questo ?:

private enum TrafficLight { 
    RED = 0, 
    GREEN = 15 
    ... 
} 

Ho provato questo ma ma sto ricevendo errori di compilazione con esso.

Grazie

+2

Vedi anche http://stackoverflow.com/questions/1419835/understanding-enums-in-java –

risposta

55

Ans 1:

enum TrafficLight { 
    RED, 
    GREEN; 

    @Override 
    public String toString() { 
    switch(this) { 
     case RED: return "abc"; 
     case GREEN: return "def"; 
     default: throw new IllegalArgumentException(); 
    } 
    } 
} 

Ans 2:

enum TrafficLight { 
    RED(0), 
    GREEN(15); 

    int value; 
    TrafficLight(int value) { this.value = value; } 
} 
+2

Può anche eseguire l'override di' toString' in ogni istanza, sebbene ciò si aggiunga al numero di classi. E probabilmente non è così pulito, ma buono per le situazioni correlate. –

70

si può fare come segue:

private enum TrafficLight { 
    // using the constructor defined below 
    RED("abc"), 
    GREEN("def"); 

    // Member to hold the name 
    private String string; 

    // constructor to set the string 
    TrafficLight(String name){string = name;} 

    // the toString just returns the given name 
    @Override 
    public String toString() { 
     return string; 
    } 
} 

È possibile aggiungere molti metodi e membri come ti piace. Credo che tu possa persino aggiungere più costruttori. Tutti i costruttori devono essere private.

Un enum in Java è fondamentalmente un class con un numero prestabilito di istanze.

+1

Questo dovrebbe essere contrassegnato come la risposta corretta. La soluzione scelta non è affatto scalabile. –

+0

@EricaKane, quale non è scalabile, l'opzione "toString with a switch"? Perché non è scalabile? Si compila con l'istruzione JVM 'tableswitch', il che significa che non c'è alcun" loop-if "sui casi switch, ma il valore case è usato per calcolare il successivo offset dell'istruzione. Inoltre, considerando che le enumerazioni solitamente contengono solo pochi valori, la scalabilità è raramente un problema. –

+0

@VsevolodGolovanov Il "toString con un interruttore" non è scalabile in quanto è necessario aggiungere un caso per ogni membro dell'enumerazione. D'altra parte la soluzione proposta con il costruttore è molto più potente in quanto è molto facile mostrare un nome personalizzato, ad es. 'TrafficLight (nome stringa, valore int) {this.value = value; string = nome + "(" + valore + ")";} ' – nkatsar

6

Anche se avete bisogno di ottenere il valore della stringa in minuscolo di enum ("rosso", "verde") Si può fare come segue :

private enum TrafficLight { 
    RED, 
    GREEN; 

    @Override 
    public String toString() { 
    return super.toString().toLowerCase(); 
    } 
} 
Problemi correlati