Utilisation des valeurs Enum comme littéraux de chaîne
Quelle est la meilleure façon d'utiliser les valeurs stockées dans une énumération en tant que littéraux de chaîne? Par exemple:
public enum Modes {
some-really-long-string,
mode1,
mode2,
mode3
}
Ensuite, je pourrais utiliser Mode.mode1
pour retourner sa représentation de chaîne comme mode1
. Sans avoir à continuer à appeler Mode.mode1.toString()
.
17 réponses
Vous ne pouvez pas. je pense que vous avez quatre options ici. Tous les quatre offrent une solution, mais avec une approche légèrement différente...
Première Option: utilisez le name()
intégré sur une énumération. C'est parfaitement bien si vous n'avez pas besoin d'un format de nommage spécial.
String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.
Option Deux: ajouter primordial des propriétés à vos énumérations si vous voulez plus de contrôle
public enum Modes {
mode1 ("Fancy Mode 1"),
mode2 ("Fancy Mode 2"),
mode3 ("Fancy Mode 3");
private final String name;
private Modes(String s) {
name = s;
}
public boolean equalsName(String otherName) {
// (otherName == null) check is not needed because name.equals(null) returns false
return name.equals(otherName);
}
public String toString() {
return this.name;
}
}
Option trois: utilisez des finales statiques au lieu d'énumérations:
public final class Modes {
public static final String MODE_1 = "Fancy Mode 1";
public static final String MODE_2 = "Fancy Mode 2";
public static final String MODE_3 = "Fancy Mode 3";
private Modes() { }
}
Option quatre: les interfaces ont chaque champ public, statique et final:
public interface Modes {
String MODE_1 = "Fancy Mode 1";
String MODE_2 = "Fancy Mode 2";
String MODE_3 = "Fancy Mode 3";
}
Chaque énumération a à la fois une méthode name() et une méthode valueOf(String). Le premier renvoie le nom de chaîne de l'énumération, et le second donne la valeur enum dont le nom est la chaîne. Est-ce comme ce que vous recherchez?
String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);
Il y a aussi une valueOf statique (Class, String) sur Enum lui-même, donc vous pouvez également utiliser
Modes mode = Enum.valueOf(Modes.class, name);
Vous pouvez remplacer la méthode toString()
pour chaque valeur enum.
Exemple:
public enum Country {
DE {
@Override
public String toString() {
return "Germany";
}
},
IT {
@Override
public String toString() {
return "Italy";
}
},
US {
@Override
public String toString() {
return "United States";
}
}
}
Utilisation:
public static void main(String[] args) {
System.out.println(Country.DE); // Germany
System.out.println(Country.IT); // Italy
System.out.println(Country.US); // United States
}
Comme le mentionne Benny Neugebauer, vous pouvez écraser la fonction toString (). Cependant, au lieu d'écraser le toString pour chaque champ enum, j'aime plus quelque chose comme ceci:
public enum Country{
SPAIN("España"),
ITALY("Italia"),
PORTUGAL("Portugal");
private String value;
Country(final String value) {
this.value = value;
}
public String getValue() {
return value;
}
@Override
public String toString() {
return this.getValue();
}
}
Vous pouvez également ajouter une méthode statique pour récupérer tous les champs, pour les imprimer tous, etc. Appelez simplement getValue pour obtenir la chaîne associée à chaque élément Enum
mode1.name()
ou String.valueOf(mode1)
. Ça ne va pas mieux que ça, j'en ai peur
public enum Modes {
MODE1("Mode1"),
MODE2("Mode2"),
MODE3("Mode3");
private String value;
public String getValue() {
return value;
}
private Modes(String value) {
this.value = value;
}
}
Vous pouvez faire un appel comme ci-dessous où vous voulez obtenir la valeur en tant que chaîne de l'énumération.
Modes.MODE1.getvalue();
Cela renverra "Mode1" sous forme de chaîne.
Vous pouvez utiliser Mode.mode1.name()
mais vous n'avez souvent pas besoin de le faire.
Mode mode =
System.out.println("The mode is "+mode);
Autant Que je sache, la seule façon d'obtenir le nom serait
Mode.mode1.name();
Si vous en avez vraiment besoin de cette façon, cependant, vous pourriez faire:
public enum Modes {
mode1 ("Mode1"),
mode2 ("Mode2"),
mode3 ("Mode3");
private String name;
private Modes(String s) {
name = s;
}
}
Enum est juste une classe un peu spéciale. Enums peut stocker des champs supplémentaires,implémenter des méthodes, etc. Par exemple
public enum Modes {
mode1('a'),
mode2('b'),
mode3('c'),
;
char c;
private Modes(char c) {
this.c = c;
}
public char character() {
return c;
}
}
Maintenant, vous pouvez dire:
System.out.println(Modes.mode1.character())
Et voir sortie:
a
package com.common.test;
public enum Days {
monday(1,"Monday"),tuesday(2,"Tuesday"),wednesday(3,"Wednesday"),
thrusday(4,"Thrusday"),friday(5,"Friday"),saturday(6,"Saturday"),sunday(7,"Sunday");
private int id;
private String desc;
Days(int id,String desc){
this.id=id;
this.desc=desc;
}
public static String getDay(int id){
for (Days day : Days.values()) {
if (day.getId() == id) {
return day.getDesc();
}
}
return null;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
};
Pour mes énumérations, Je n'aime pas vraiment penser qu'elles soient allouées avec 1 chaîne chacune. C'est ainsi que j'implémente une méthode toString() sur enums.
enum Animal
{
DOG, CAT, BIRD;
public String toString(){
switch (this) {
case DOG: return "Dog";
case CAT: return "Cat";
case BIRD: return "Bird";
}
return null;
}
}
Cette méthode devrait fonctionner avec n'importe quel enum
:
public enum MyEnum {
VALUE1,
VALUE2,
VALUE3;
public int getValue() {
return this.ordinal();
}
public static DataType forValue(int value) {
return values()[value];
}
public String toString() {
return forValue(getValue()).name();
}
}
Ma solution pour votre problème!
import java.util.HashMap;
import java.util.Map;
public enum MapEnumSample {
Mustang("One of the fastest cars in the world!"),
Mercedes("One of the most beautiful cars in the world!"),
Ferrari("Ferrari or Mercedes, which one is the best?");
private final String description;
private static Map<String, String> enumMap;
private MapEnumSample(String description) {
this.description = description;
}
public String getEnumValue() {
return description;
}
public static String getEnumKey(String name) {
if (enumMap == null) {
initializeMap();
}
return enumMap.get(name);
}
private static Map<String, String> initializeMap() {
enumMap = new HashMap<String, String>();
for (MapEnumSample access : MapEnumSample.values()) {
enumMap.put(access.getEnumValue(), access.toString());
}
return enumMap;
}
public static void main(String[] args) {
// getting value from Description
System.out.println(MapEnumSample.getEnumKey("One of the fastest cars in the world!"));
// getting value from Constant
System.out.println(MapEnumSample.Mustang.getEnumValue());
System.out.println(MapEnumSample.getEnumKey("One of the most beautiful cars in the world!"));
System.out.println(MapEnumSample.Mercedes.getEnumValue());
// doesnt exist in Enum
System.out.println("Mustang or Mercedes, which one is the best?");
System.out.println(MapEnumSample.getEnumKey("Mustang or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
+ MapEnumSample.getEnumKey("Ferrari or Mustang, which one is the best?") + " is the best!.");
// exists in Enum
System.out.println("Ferrari or Mercedes, wich one is the best?");
System.out.println(MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that "
+ MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") + " is the best!");
}
}
Après de nombreux essais, je suis venu avec cette solution
public static enum Operation {
Addition, Subtraction, Multiplication, Division,;
public String getUserFriendlyString() {
if (this==Addition) {
return " + ";
} else if (this==Subtraction) {
return " - ";
} else if (this==Multiplication) {
return " * ";
} else if (this==Division) {
return " / ";
}
return "undefined";
}
}
Modes.MODE1.toString();
C'est un moyen facile sans créer d'interface, de classe ou de setters getter
public enum Environment
{
PROD("https://prod.domain.com:1088/"),
SIT("https://sit.domain.com:2019/"),
CIT("https://cit.domain.com:8080/"),
DEV("https://dev.domain.com:21323/");
private String url;
Environment(String envUrl) {
this.url = envUrl;
}
public String getUrl() {
return url;
}
}
String prodUrl = Environment.PROD.getUrl();
Il va imprimer:
https://prod.domain.com:1088/
Cette conception pour les constantes de chaîneenum fonctionne dans la plupart des cas.