2010-03-23 16 views
37

Parece que es posible en Java para escribir algo como esto:La implementación toString en las enumeraciones de 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? 
    } 
} 

Ahora, me gustaría saber si es posible returnin el método toString "abc" cuando el de enumeración el valor es rojo y "def" cuando es verde. Además, es posible hacer como en C#, donde se puede hacer esto ?:

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

He intentado esto pero, pero estoy recibiendo errores de compilación con él.

Gracias

+2

Ver también http://stackoverflow.com/questions/1419835/understanding-enums-in-java –

Respuesta

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

También puede anular' toString' en cada instancia, aunque eso se suma al número de clases. Y probablemente no es tan limpio, pero es bueno para situaciones relacionadas. –

70

Puede hacerlo de la siguiente manera:

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; 
    } 
} 

Puede añadir tantos métodos y los miembros que lo desee. Creo que incluso puedes agregar múltiples constructores. Todos los constructores deben ser private.

Un enum en Java es básicamente un class que tiene un número de instancias establecido.

+1

Esto debe ser marcado como la respuesta correcta. La solución elegida no es escalable en absoluto. –

+0

@EricaKane, ¿cuál de ellos no es escalable, el de "toString with a switch"? ¿Por qué no es escalable? Se compila con la instrucción JVM 'tableswitch', lo que significa que no hay" loop-if "en las cajas de los conmutadores, sino que el valor de la caja se utiliza para calcular el siguiente desplazamiento de la instrucción. Además, teniendo en cuenta que las enumeraciones generalmente contienen solo unos pocos valores, la escalabilidad rara vez es un problema. –

+0

@VsevolodGolovanov El "toString con un interruptor" no es escalable, ya que necesita agregar un caso para cada miembro de la enumeración. Por otro lado, la solución propuesta con el constructor es mucho más poderosa, ya que es muy fácil mostrar un nombre personalizado, p. 'TrafficLight (String name, int value) {this.value = value; string = name + "(" + value + ")";} ' – nkatsar

6

Además, si usted necesita para obtener valor de cadena minúsculas de enumeración ("rojo", "verde") Puede hacerlo de la siguiente manera :

private enum TrafficLight { 
    RED, 
    GREEN; 

    @Override 
    public String toString() { 
    return super.toString().toLowerCase(); 
    } 
} 
Cuestiones relacionadas