2010-03-23 3 views
37

Il semble être possible en Java d'écrire quelque chose comme ceci:La mise en œuvre toString sur Java énumérations

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

Maintenant, je voudrais savoir s'il possible de returnin la méthode toString « abc » lorsque Les années ENUM la valeur est rouge et "def" quand c'est vert. Aussi, est-il possible de faire comme en C#, où vous pouvez le faire ?:

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

J'ai essayé cela, mais mais je reçois des erreurs du compilateur avec elle.

Merci

+2

Voir aussi http://stackoverflow.com/questions/1419835/understanding-enums-in-java –

Répondre

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

Peut également remplacer' toString' dans chaque instance, bien que cela ajoute au nombre de classes. Et n'est probablement pas si propre, mais bon pour les situations connexes. –

70

Vous pouvez le faire comme suit:

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

Vous pouvez ajouter autant de méthodes et des membres que vous le souhaitez. Je crois que vous pouvez même ajouter plusieurs constructeurs. Tous les constructeurs doivent être private.

Un enum en Java est fondamentalement un class qui a un nombre défini d'instances.

+1

Cela devrait être marqué comme la bonne réponse. La solution choisie n'est pas évolutive du tout. –

+0

@EricaKane, dont on n'est pas évolutif, le "toString with a switch" un? Pourquoi n'est-il pas évolutif? Il est compilé avec l'instruction JVM 'tableswitch', ce qui signifie qu'il n'y a pas de" loop-if "dans les cas de commutation - au lieu de cela la valeur de cas est utilisée pour calculer le décalage d'instruction suivant. En outre, étant donné que les énumérations ne contiennent généralement que quelques valeurs, l'évolutivité est rarement un problème. –

+0

@VsevolodGolovanov Le "toString avec un commutateur" n'est pas évolutif car vous devez ajouter un cas pour chaque membre de l'énumération. D'un autre côté, la solution proposée avec le constructeur est beaucoup plus puissante car il est très facile de montrer un nom personnalisé, par ex. 'TrafficLight (nom de chaîne, valeur int) {this.value = valeur; string = name + "(" + value + ")";} ' – nkatsar

6

Aussi, si vous avez besoin pour obtenir la valeur de chaîne minuscule de ENUM ("rouge", "vert") Vous pouvez le faire comme suit :

private enum TrafficLight { 
    RED, 
    GREEN; 

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