J'ai une classe avec une liste d'énumérations, les énumérations sont passées à un constructeur et mises à jour vers toString, mais je ne suis pas autorisé à avoir une variable d'instance sur la classe (une partie de l'exigence). Comment puis-je faire en sorte que les énumérations soient sorties comme la chaîne sans ajouter d'instance?
public enum Other { GAME_BOY("Game Boy"), MACBOOK("Macbook Pro"), IPHONE("iPhone XS"), LAPTOP("Laptop"); private final String product; //can't have instance variable private Other(String passed) { this.product = passed; } @Override public String toString() { return product; } }
4 Réponses :
Vous pouvez remplacer toString()
pour chaque élément:
public enum Other { GAME_BOY { @Override public String toString() { return "Game Boy"; } }, MACBOOK { ... }, ... }
Voir ce code exécuté en direct sur IdeOne.com .
Je pense que cette solution polymorphe est plus précise que d'autres avec une instruction switch (en termes de java en tant que langage POO)
Vous pouvez également placer une instruction switch dans la méthode toString:
@Override public String toString() { switch (this) { case GAME_BOY: return "Game boy"; case MACBOOK: return "Macbook Pro"; ... } }
Merci, cela a fonctionné, je ne savais pas que vous pouviez le surpasser comme ça.
Que diriez-vous de ce qui suit: -
public enum Other { GAME_BOY, MACBOOK, IPHONE, LAPTOP; @Override public String toString() { switch(this) { case GAME_BOY: return "Game Boy"; case MACBOOK: return "Macbook Pro"; case IPHONE: return "iPhone XS"; case LAPTOP: return "Laptop"; default: return null; } } public static void main(String[] args) { System.out.println("The value of the other is " + Other.GAME_BOY.toString()); } }
switch
amélioréLa réponse acceptée de Williamson fournit un code qui peut être amélioré dans Java 14 et versions ultérieures. L'instruction de commutation améliorée peut empêcher le problème de manquer l'un des objets enum dans votre liste de cas de commutation. Voir: JEP 361: Switch Expressions .
La nouvelle syntaxe est également concise, plus facile à lire.
L'utilisation de la nouvelle approche ressemble à ceci:
// Example usage. public static void main ( String[] args ) { for ( Device device : Device.values() ) { System.out.println( "device = " + device ); } }
Revenez maintenant en arrière et ajoutez un nouveau type d'appareil, tel que WATCH
.
case WATCH -> "Watch";
Le compilateur marquera votre instruction switch
comme incorrecte. Vous verrez un message comme:
l'expression de commutateur ne couvre pas toutes les valeurs d'entrée possibles
Ajoutez le cas supplémentaire dans votre switch
, satisfaisant ainsi le compilateur. Ensuite, dormez bien en sachant qu'un vilain bogue a été évité.
GAME_BOY, MACBOOK, IPHONE, LAPTOP, WATCH;
Exemple d'utilisation:
package work.basil.example; public enum Device { GAME_BOY, MACBOOK, IPHONE, LAPTOP; @Override public String toString ( ) { return switch ( this ) { case GAME_BOY -> "Game boy"; case MACBOOK -> "Macbook Pro"; case IPHONE -> "iPhone XS"; case LAPTOP -> "Laptop"; }; } }
Voir les questions liées / similaires .