Enum-waarden gebruiken als tekenreeksletters

Wat is de beste manier om de waarden die in een Enum zijn opgeslagen te gebruiken als String-letterwoorden?
Bijvoorbeeld:

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

Later zou ik Mode.mode1kunnen gebruiken om de tekenreeksrepresentatie terug te geven als mode1. Zonder dat je Mode.mode1.toString()moet blijven aanroepen.


Antwoord 1, autoriteit 100%

Dat kan niet. Ik denk dat je hier VIER opties hebt. Alle vier bieden ze een oplossing, maar met een iets andere aanpak…

Optie één:gebruik de ingebouwde name()op een opsomming. Dit is prima als je geen speciaal naamgevingsformaat nodig hebt.

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

Optie twee:voeg overheersende eigenschappen toe aan uw opsommingen als u meer controle wilt

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

Optie drie:gebruik statische finales in plaats van opsommingen:

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() { }
}

Optie vier:interfaces hebben elk veld openbaar, statisch en definitief:

public interface Modes {
    String MODE_1 = "Fancy Mode 1";
    String MODE_2 = "Fancy Mode 2";
    String MODE_3 = "Fancy Mode 3";  
}

Antwoord 2, autoriteit 71%

Elke enum heeft zowel een name()als een valueOf(String)methode. De eerste retourneert de tekenreeksnaam van de enum, en de laatste geeft de enumwaarde waarvan de naam de tekenreeks is. Is dit wat je zoekt?

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

Er is ook een statische valueOf(Class, String)op enumzelf, dus je zou ook kunnen gebruiken:

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

Antwoord 3, autoriteit 12%

U kunt de methode toString()voor elke enumwaarde overschrijven.

Voorbeeld:

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

Gebruik:

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
}

Antwoord 4, autoriteit 6%

Zoals Benny Neugebauer vermeldt, zou je de toString() kunnen overschrijven. Maar in plaats daarvan overschrijven van de toString voor elk enum veld vind ik meer zoiets als dit:

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

Je zou ook een statische methode kunnen toevoegen om alle velden op te halen, ze allemaal af te drukken, enz.
Roep gewoon getValue aan om de string te verkrijgen die aan elk Enum-item is gekoppeld


Antwoord 5, autoriteit 5%

mode1.name()of String.valueOf(mode1). Beter dan dat wordt het niet, vrees ik


Antwoord 6, autoriteit 4%

public enum Modes {
  MODE1("Mode1"),
  MODE2("Mode2"),
  MODE3("Mode3");
 private String value;
 public String getValue() {
    return value;
   }
 private Modes(String value) {
  this.value = value;
 } 
}

u kunt een oproep plaatsen zoals hieronder waar u maar wilt om de waarde als een tekenreeks uit de enum te krijgen.

Modes.MODE1.getvalue();

Hiermee wordt “Mode1” geretourneerd als een tekenreeks.


Antwoord 7

Voor mijn opsommingen denk ik er niet echt aan dat ze elk met 1 String worden toegewezen. Dit is hoe ik een toString() methode implementeer op 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;
    }
}

Antwoord 8

U kunt Mode.mode1.name()gebruiken, maar dit is vaak niet nodig.

Mode mode =
System.out.println("The mode is "+mode);

Antwoord 9

Voor zover ik weet, zou de enige manier om de naam te krijgen zijn

Mode.mode1.name();

Als je het op deze manier echt nodig hebt, kun je het volgende doen:

public enum Modes {
    mode1 ("Mode1"),
    mode2 ("Mode2"),
    mode3 ("Mode3");
    private String name;       
    private Modes(String s) {
        name = s;
    }
}

Antwoord 10

U kunt eenvoudig het volgende gebruiken:

""+ Modes.mode1

Antwoord 11

mijn oplossing voor uw probleem!

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

Antwoord 12

Enum is gewoon een beetje speciale klasse. Enums kan extra velden opslaan, methoden implementeren, enz. Bijvoorbeeld

public enum Modes {
    mode1('a'),
    mode2('b'),
    mode3('c'),
    ;
    char c;
    private Modes(char c) {
        this.c = c;
    }
    public char character() {
        return c;
    }
}

Nu kun je zeggen:

System.out.println(Modes.mode1.character())

en zie uitvoer:
a


Antwoord 13

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

Antwoord 14

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

Het wordt afgedrukt:

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

Dit ontwerp voor enum-tekenreeksconstantenwerkt in de meeste gevallen.


Antwoord 15

Deze methode zou moeten werken met elke 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();
    }
}

Antwoord 16

na vele pogingen ben ik tot deze oplossing gekomen

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

Antwoord 17

Je kunt dit proberen:

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

}


Antwoord 18

ik ontdekte dat deze makkelijker is om typefouten te voorkomen:

public enum Modes {
    some-really-long-string,
    mode1,
    mode2,
    mode3;
    String str;
    Modes(){
        this.str = super.name();
    }
    @Override
    @NonNull
    public String toString() {
        return str;
    }

echter – dit kan werken wanneer u een String op een log/println moet gebruiken of wanneer java de methode toString() automatisch compileert, maar op een coderegel als deze ->

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

in plaats daarvan, zoals hierboven vermeld, moet u de enum nog steeds uitbreiden en .name() gebruiken in die gevallen als deze:

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

Antwoord 19

gebruik mode1.name()of String.valueOf(Modes.mode1)

Other episodes