什么是最好的方法来使用存储在Enum字符串字面量的值? 例如:
public enum Modes {
some-really-long-string,
mode1,
mode2,
mode3
}
然后我就可以用《风尚》了。将其字符串表示形式返回为Mode1。而不必一直调用Mode.mode1.toString()。
什么是最好的方法来使用存储在Enum字符串字面量的值? 例如:
public enum Modes {
some-really-long-string,
mode1,
mode2,
mode3
}
然后我就可以用《风尚》了。将其字符串表示形式返回为Mode1。而不必一直调用Mode.mode1.toString()。
当前回答
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();
它将打印:
https://prod.domain.com:1088/
这种枚举字符串常量的设计在大多数情况下都有效。
其他回答
正如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项关联的字符串
每个枚举都有一个name()和valueOf(String)方法。前者返回enum的字符串名称,后者给出名称为该字符串的enum值。这就是你要找的吗?
String name = Modes.mode1.name();
Modes mode = Modes.valueOf(name);
Enum本身也有一个静态valueOf(Class, String),所以你也可以使用:
Modes mode = Enum.valueOf(Modes.class, name);
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 ())
并查看输出: 一个
据我所知,唯一的办法就是
Mode.mode1.name();
然而,如果你真的需要这样做,你可以这样做:
public enum Modes {
mode1 ("Mode1"),
mode2 ("Mode2"),
mode3 ("Mode3");
private String name;
private Modes(String s) {
name = s;
}
}
你不能。我认为你有四个选择。这四家公司都提供了解决方案,但方法略有不同。
选项一:在枚举上使用内置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、static和final:
public interface Modes {
String MODE_1 = "Fancy Mode 1";
String MODE_2 = "Fancy Mode 2";
String MODE_3 = "Fancy Mode 3";
}