Remplacez valueof () et toSsortingng () dans Java enum

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:

  1. Cette solution suppose que chaque valeur de chaîne atsortingbuée est unique et non nulle. Étant donné que le créateur de l’énum peut contrôler cela, et que la chaîne correspond à la valeur d’énumération unique et non nulle, cela semble être une ressortingction sûre.
  2. J’ai ajouté la méthode ‘toSTring ()’ comme demandé dans la question

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