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().

287
demandé sur Marcello Grechi Lins 2011-07-12 19:57:11

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";  
}
512
répondu Michael J. Lee 2018-06-14 11:11:31

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);
414
répondu Ryan Stewart 2011-07-12 16:05:31

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
}
66
répondu Benny Neugebauer 2014-08-29 19:35:03

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

26
répondu iberodev 2014-10-01 23:15:41

mode1.name() ou String.valueOf(mode1). Ça ne va pas mieux que ça, j'en ai peur

24
répondu Sean Patrick Floyd 2011-07-12 16:00:58
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.

16
répondu vamsi 2018-01-20 20:20:20

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);
6
répondu Peter Lawrey 2011-07-12 16:01:08

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;
    }
}
5
répondu Jake Roussel 2011-07-12 16:02:22

, Vous pouvez simplement utiliser:

""+ Modes.mode1
4
répondu Buddy 2015-10-09 11:13:29

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

3
répondu AlexR 2011-07-12 16:04:18
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;
    }



};
3
répondu 2016-01-28 09:47:53

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;
    }
}
3
répondu Ethan 2016-12-28 04:34:49

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();
    }
}
3
répondu Caner 2017-06-19 12:23:46

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!");

    }
}
2
répondu Renan Galdino da Silva 2016-01-21 05:28:14

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";
       }
}
0
répondu Basheer AL-MOMANI 2016-03-17 04:02:07
Modes.MODE1.toString();

C'est un moyen facile sans créer d'interface, de classe ou de setters getter

0
répondu Prateek Mehta 2017-06-03 12:42:21
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.

0
répondu lokesh 2018-08-11 16:10:06