web-dev-qa-db-fra.com

Utilisation de valeurs Enum en tant que littéraux de chaîne

Quelle est la meilleure façon d'utiliser les valeurs stockées dans un enum 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 renvoyer sa représentation sous forme de chaîne sous la forme mode1. Sans avoir à continuer à appeler Mode.mode1.toString().

315
Larry

Tu ne peux 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: utilise la name() intégrée sur un enum. Cela convient parfaitement si vous n'avez besoin d'aucun format de nommage spécial.

    String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.

Deuxième option: ajouter des propriétés de substitution à vos enums 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: utilise des finales statiques au lieu d'enums: 

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 tous les champs public, static et final:

public interface Modes {

    String MODE_1 = "Fancy Mode 1";
    String MODE_2 = "Fancy Mode 2";
    String MODE_3 = "Fancy Mode 3";  
}
554
Michael J. Lee

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, ​​et le second donne la valeur enum dont le nom est la chaîne. Est-ce que c'est comme ce que vous cherchez?

String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);

Il y a aussi un valueOf statique (Class, String) sur Enum lui-même, vous pouvez donc aussi utiliser

Modes mode = Enum.valueOf(Modes.class, name);
442
Ryan Stewart

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
}
70
Benny Neugebauer

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

27
Sean Patrick Floyd

Comme le mentionne Benny Neugebauer, vous pouvez écraser toString (). Cependant au lieu de remplacer le toString pour chaque champ enum, j'aime plus quelque chose comme ça:

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 extraire tous les champs, les imprimer tous, etc.

27
iberodev
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 effectuer un appel comme ci-dessous où vous voulez obtenir la valeur sous forme de chaîne à partir de l'énum.

Modes.MODE1.getvalue();

Cela retournera "Mode1" en tant que chaîne.

17
vamsi

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);
7
Peter Lawrey

Pour autant que je sache, le seul moyen d’obtenir le nom serait

Mode.mode1.name();

Si vous en avez vraiment besoin de cette façon, vous pourriez faire:

public enum Modes {
    mode1 ("Mode1"),
    mode2 ("Mode2"),
    mode3 ("Mode3");

    private String name;       

    private Modes(String s) {
        name = s;
    }
}
7
Jake Roussel

Vous pouvez simplement utiliser:

""+ Modes.mode1
5
Buddy

Pour mes enums, je n'aime pas trop penser à leur attribution d'une chaîne. Voici comment j'implémente une méthode toString () sur des énumérations.

enum Animal
{
    DOG, CAT, BIRD;
    public String toString(){
        switch (this) {
            case DOG: return "Dog";
            case CAT: return "Cat";
            case BIRD: return "Bird";
        }
        return null;
    }
}
5
Ethan
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;
    }



};
4
user4772709

Enum est juste un peu classe spéciale. Les enums peuvent 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 la sortie: a

3
AlexR

Cette méthode devrait fonctionner avec toute variable 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
Caner

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
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 imprimera:

https://prod.domain.com:1088/

Cette conception pour les constantes de chaîne enum fonctionne dans la plupart des cas.

1
lokesh
Modes.MODE1.toString();

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

1
Prateek Mehta

j'ai trouvé que celui-ci est plus facile à utiliser pour éviter les erreurs de type:

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3;

    String str;

    Modes(){
        this.str = super.name();
    }

    @Override
    @NonNull
    public String toString() {
        return str;
    }

cependant - cela peut fonctionner lorsque vous devez utiliser une chaîne sur un journal/println ou lorsque Java compile automatiquement la méthode toString (), mais sur une ligne de code comme celle-ci ->

// sample method that require (string,value)
intent.putExtra(Modes.mode1 ,shareElement.getMode()); // Java error
// first argument enum does not return value

comme mentionné ci-dessus, vous devrez toujours étendre l'énumération et utiliser .name() dans les cas comme celui-ci:

intent.putExtra(Modes.mode1.name() ,shareElement.getMode()); 
0
ItzikH

Vous pouvez essayer ceci:

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3;

    public String toString(){
        switch(this) {
            case some-really-long-string:
                return "some-really-long-string";
            case mode2:
                return "mode2";
            default: return "undefined";
        }
    }

}

0
Kamil Naja

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
Basheer AL-MOMANI