Les valeurs dans mon enum
sont des mots qui doivent avoir des espaces, mais les enum
ne peuvent pas contenir d’espaces, donc tout est groupé. Je veux remplacer toSsortingng()
pour append ces espaces là où je le dis.
Je veux également que l’énumération fournisse la énumération correcte lorsque j’utilise valueOf()
sur la même chaîne à laquelle j’ai ajouté les espaces.
Par exemple:
public enum RandomEnum { StartHere, StopHere }
Appelez toSsortingng()
sur RandomEnum
dont la valeur est StartHere
renvoie la chaîne "Start Here"
. La valeur StartHere
valueof()
sur cette même chaîne ( "Start Here"
) renvoie la valeur enum StartHere
.
Comment puis-je faire ceci?
Vous pouvez essayer ce code. Comme vous ne pouvez pas remplacer la méthode valueOf
, vous devez définir une méthode personnalisée ( getEnum
dans l’exemple de code ci-dessous) qui renvoie la valeur dont vous avez besoin et changez votre client pour utiliser cette méthode à la place.
public enum RandomEnum { StartHere("Start Here"), StopHere("Stop Here"); private Ssortingng value; RandomEnum(Ssortingng value) { this.value = value; } public Ssortingng getValue() { return value; } @Override public Ssortingng toSsortingng() { return this.getValue(); } public static RandomEnum getEnum(Ssortingng value) { for(RandomEnum v : values()) if(v.getValue().equalsIgnoreCase(value)) return v; throw new IllegalArgumentException(); } }
Essayez ceci, mais je ne suis pas certain que cela fonctionnera partout 🙂
public enum MyEnum { A("Start There"), B("Start Here"); MyEnum(Ssortingng name) { try { Field fieldName = getClass().getSuperclass().getDeclaredField("name"); fieldName.setAccessible(true); fieldName.set(this, name); fieldName.setAccessible(false); } catch (Exception e) {} } }
Qu’en est-il d’une implémentation Java 8? (null peut être remplacé par votre énumération par défaut)
public static RandomEnum getEnum(Ssortingng value) { List list = Arrays.asList(RandomEnum.values()); return list.stream().filter(m -> m.value.equals(value)).findAny().orElse(null); }
Ou vous pourriez utiliser:
...findAny().orElseThrow(NotFoundException::new);
Vous pouvez utiliser une carte statique dans votre enum qui mappe des chaînes à des constantes d’énumération. Utilisez-le dans une méthode statique ‘getEnum’. Cela évite de devoir parcourir les énumérations à chaque fois que vous voulez en obtenir une de sa valeur de chaîne.
public enum RandomEnum { StartHere("Start Here"), StopHere("Stop Here"); private final Ssortingng strVal; private RandomEnum(Ssortingng strVal) { this.strVal = strVal; } public static RandomEnum getEnum(Ssortingng strVal) { if(!strValMap.containsKey(strVal)) { throw new IllegalArgumentException("Unknown Ssortingng Value: " + strVal); } return strValMap.get(strVal); } private static final Map strValMap; static { final Map tmpMap = Maps.newHashMap(); for(final RandomEnum en : RandomEnum.values()) { tmpMap.put(en.strVal, en); } strValMap = ImmutableMap.copyOf(tmpMap); } @Override public Ssortingng toSsortingng() { return strVal; } }
Assurez-vous simplement que l’initialisation statique de la carte se produit sous la déclaration des constantes enum.
BTW – ce type “ImmutableMap” provient de l’API Google goyave, et je le recommande définitivement dans de tels cas.
EDIT – Par les commentaires:
Vous avez toujours une option pour implémenter dans votre enum ceci:
public static > T valueOf(Class enumType, Ssortingng name){...}
Je ne pense pas que vous allez obtenir ValueOf (“Start Here”) pour travailler. Mais en ce qui concerne les espaces … essayez ce qui suit …
static private enum RandomEnum { R("Start There"), G("Start Here"); Ssortingng value; RandomEnum(Ssortingng s) { value = s; } } System.out.println(RandomEnum.G.value); System.out.println(RandomEnum.valueOf("G").value); Start Here Start Here
Ce qui suit est une belle alternative générique à valueOf ()
public static RandomEnum getEnum(Ssortingng value) { for (RandomEnum re : RandomEnum.values()) { if (re.description.compareTo(value) == 0) { return re; } } throw new IllegalArgumentException("Invalid RandomEnum value: " + value); }