What is the best way to use the values stored in an Enum as String literals?For example:
public enum Modes {some-really-long-string,mode1,mode2,mode3}
Then later I could use Mode.mode1
to return its string representation as mode1
. Without having to keep calling Mode.mode1.toString()
.
Best Answer
You can't. I think you have FOUR options here. All four offer a solution but with a slightly different approach...
Option One: use the built-in name()
on an enum. This is perfectly fine if you don't need any special naming format.
String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.
Option Two: add overriding properties to your enums if you want more control
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 Three: use static finals instead of 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 Four: interfaces have every field public, static and final:
public interface Modes {String MODE_1 = "Fancy Mode 1";String MODE_2 = "Fancy Mode 2";String MODE_3 = "Fancy Mode 3"; }
Every enum has both a name()
and a valueOf(String)
method. The former returns the string name of the enum, and the latter gives the enum value whose name is the string. Is this like what you're looking for?
String name = Modes.mode1.name();Modes mode = Modes.valueOf(name);
There's also a static valueOf(Class, String)
on Enum
itself, so you could also use:
Modes mode = Enum.valueOf(Modes.class, name);
You could override the toString()
method for each enum value.
Example:
public enum Country {DE {@Overridepublic String toString() {return "Germany";}},IT {@Overridepublic String toString() {return "Italy";}},US {@Overridepublic String toString() {return "United States";}}}
Usage:
public static void main(String[] args) {System.out.println(Country.DE); // GermanySystem.out.println(Country.IT); // ItalySystem.out.println(Country.US); // United States}
As Benny Neugebauer mentions, you could overwrite the toString(). However instead overwriting the toString for each enum field I like more something like this:
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;}@Overridepublic String toString() {return this.getValue();}}
You could also add a static method to retrieve all the fields, to print them all, etc.Simply call getValue to obtain the string associated to each Enum item
mode1.name()
or String.valueOf(mode1)
. It doesn't get better than that, I'm afraid
public enum Modes {MODE1("Mode1"),MODE2("Mode2"),MODE3("Mode3");private String value;public String getValue() {return value;}private Modes(String value) {this.value = value;} }
you can make a call like below wherever you want to get the value as a string from the enum.
Modes.MODE1.getvalue();
This will return "Mode1" as a String.
For my enums I don't really like to think of them being allocated with 1 String each. This is how I implement a toString() method on 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;}}
As far as I know, the only way to get the name would be
Mode.mode1.name();
If you really need it this way, however, you could do:
public enum Modes {mode1 ("Mode1"),mode2 ("Mode2"),mode3 ("Mode3");private String name; private Modes(String s) {name = s;}}
You can use Mode.mode1.name()
however you often don't need to do this.
Mode mode =System.out.println("The mode is "+mode);
my solution for your problem!
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 DescriptionSystem.out.println(MapEnumSample.getEnumKey("One of the fastest cars in the world!"));// getting value from ConstantSystem.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 EnumSystem.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 EnumSystem.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!");}}
You can simply use:
""+ Modes.mode1
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();
It will print:
https://prod.domain.com:1088/
This design for enum string constants works in most of the cases.
Enum is just a little bit special class. Enums can store additional fields, implement methods etc. For example
public enum Modes {mode1('a'),mode2('b'),mode3('c'),;char c;private Modes(char c) {this.c = c;}public char character() {return c;}}
Now you can say:
System.out.println(Modes.mode1.character())
and see output: a
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;}};
This method should work with any 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();}}
i found this one is more easy for preventing type error:
public enum Modes {some-really-long-string,mode1,mode2,mode3;String str;Modes(){this.str = super.name();}@Override@NonNullpublic String toString() {return str;}
however - this may work when you need to use a String on a log/println or whenever java compiles the toString() method automatically, but on a code line like this ->
// sample method that require (string,value)intent.putExtra(Modes.mode1 ,shareElement.getMode()); // java error// first argument enum does not return value
instead as mentioned above you will still have to extend the enum and use .name()
in those cases like this:
intent.putExtra(Modes.mode1.name() ,shareElement.getMode());
after many tries I have come with this 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";}}
You can try this:
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";}}
}
use mode1.name()
or String.valueOf(Modes.mode1)