使用Enum值作为string文字
将Enum中存储的值用作string文字的最佳方法是什么? 例如:
public enum Modes { some-really-long-string, mode2, mode3 }
然后,我可以使用Mode.mode1
返回它的string表示forms为mode1
。 而不必保持调用Mode.model.toString()
。
你不能。 我想你在这里有四个选项。 所有四个提供了一个解决scheme,但稍有不同的方法…
选项一: 在枚举上使用内build的name()
String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration.
选项二: 如果你想要更多的控制权,可以在你的枚举中添加重写属性
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; } }
选项三: 使用静态决赛而不是枚举:
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() { } }
选项四: 界面具有公共,静态和最终的各个领域:
public interface Modes { String MODE_1 = "Fancy Mode 1"; String MODE_2 = "Fancy Mode 2"; String MODE_3 = "Fancy Mode 3"; }
每个枚举都有一个name()和一个valueOf(String)方法。 前者返回枚举的string名称,后者给出名称为string的枚举值。 这就像你在找什么?
String name = Modes.mode1.name(); Modes mode = Modes.valueOf(name);
在Enum本身也有一个静态的valueOf(Class,String),所以你也可以使用
Modes mode = Enum.valueOf(Modes.class, name);
您可以覆盖每个枚举值的toString()
方法。
例:
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"; } } }
用法:
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 }
mode1.name()
或String.valueOf(mode1)
。 恐怕没有比这更好的了
正如Benny Neugebauer提到的,你可以覆盖toString()。 然而,而不是覆盖每个枚举字段的toString我更喜欢这样的事情:
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(); } }
您也可以添加一个静态方法来检索所有的字段,打印所有的字段等。只需调用getValue来获取与每个Enum项关联的string
public enum Modes { MODE1("Mode1"), MODE2("Mode2"), MODE3("Mode3"); private String value; public String getValue() { return value; } private Modes(String value) { this.value = value; } }
你可以像下面那样打电话,你想从枚举中获取string的值。
Modes.MODE1.getvalue();
这将返回“Mode1”作为string。
你可以使用Mode.mode1.name()
但是你通常不需要这样做。
Mode mode = System.out.println("The mode is "+mode);
据我所知,获得这个名字的唯一方法是
Mode.mode1.name();
如果你真的需要这样的话,你可以这样做:
public enum Modes { mode1 ("Mode1"), mode2 ("Mode2"), mode3 ("Mode3"); private String name; private Modes(String s) { name = s; } }
你可以简单地使用:
""+ Modes.mode1
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; } };
Enum只是一个有点特殊的类。 枚举可以存储额外的字段,实现方法等
public enum Modes { mode1('a'), mode2('b'), mode3('c'), ; char c; private Modes(char c) { this.c = c; } public char character() { return c; } }
现在你可以说:
System.out.println(Modes.mode1.character())
并看到输出: a
我的解决scheme为您的问题!
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!"); } }
对于我的枚举,我真的不想把它们分配给每个1个string。 这就是我如何在枚举上实现一个toString()方法。
enum Animal { DOG, CAT, BIRD; public String toString(){ switch (this) { case DOG: return "Dog"; case CAT: return "Cat"; case BIRD: return "Bird"; } return null; } }
这个方法应该适用于任何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(); } }
经过多次尝试,我已经与这个解决scheme
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"; } }
Modes.MODE1.toString();
这是一个简单的方法,无需创build接口,类或getter设置器
所以只是为了构build上面的一些答案..很多时候我会用枚举器来表示事物的“types”,但是那些types也有其他属性,比如一个int ID和一个stringDescription。
下面的解决scheme对我来说很有用,给我一个枚举器更有用
public enum Country { US(1) { @Override public String toString() { return "United States"; } }, DE(2) { @Override public String toString() { return "Germany"; } }, IT(3) { @Override public String toString() { return "Italy"; } } private int value; private Country (int value) { this.value = value; } private Country fromValue(int value){ for(Country val: Country.values()){ if(val.value == value){ return val; } } return null; } int value (){ return value; } }
….我是新来的Java btw ..所以如果有这个问题,我很想知道
我恳求那些漫游者中没有一个考虑Enum的属性。 Enum对于程序员来说是易读的,而Attribute可以包含一个完整的名字或者是指向翻译的“指针”。 这样你就可以在枚举之间重复名称,而且在属性中没有任何string的唯一性,因为它们可能很长。
public enum MyEnum { [Name("MY_UNIQUE_STRING_FOR_ENUM1")] Enum1, [Name("MY_UNIQUE_STRING_FOR_ENUM2")] Enum2, [Name("MY_UNIQUE_STRING_FOR_ENUM3")] Enum3, }
用法:
public static string GetEnumName(Enum name) { var attribute = name.GetType().GetCustomAttributes(false).FirstOrDefault(o => o is Name); return attribute.Value; } GetEnumName(MyEnum.Enum1);