Java Enum toString()方法
我有几个Java枚举使用下划线分隔单词。在我的每个枚举中,我都有一个toString方法,它被实现为super.toString().replace(““,”),这样我就可以在GUI上显示字符串值,而不需要下划线。有没有什么方法可以让我所有的枚举都使用这个toString方法,而不用在所有枚举中重复它?如果这是一个常规类,答案很简单,实现toString(),然后让我所有需要该实现的类扩展该类,但枚举不能扩展任何内容,甚至不能扩展另一个枚举Java Enum toString()方法,java,enums,Java,Enums,我有几个Java枚举使用下划线分隔单词。在我的每个枚举中,我都有一个toString方法,它被实现为super.toString().replace(““,”),这样我就可以在GUI上显示字符串值,而不需要下划线。有没有什么方法可以让我所有的枚举都使用这个toString方法,而不用在所有枚举中重复它?如果这是一个常规类,答案很简单,实现toString(),然后让我所有需要该实现的类扩展该类,但枚举不能扩展任何内容,甚至不能扩展另一个枚举 public enum Example1 {
public enum Example1 {
HELLO_WORLD, HELLO_EARTH, HELLO_GLOBE
@Override public String toString() {
return super.toString().replace("_", " ");
}
}
public enum Example2 {
ANSWER_1, ANSWER_2, ANSWER_3
@Override public String toString() {
return super.toString().replace("_", " ");
}
}
是否有人有一个解决方案不会在所有枚举中复制此toString()方法?声明一些帮助程序方法,如
public static <E extends Enum<E>> String toString(Enum<E> value) {
return value.name().replace("_", ""); // use name() as suggested in comments
}
在Java8中,您可以使用一个带有默认实现的接口,所有枚举都实现该接口(但不重写)
或者
类型安全方法:
public abstract class MyEnum<E extends MyEnum<E>> {
protected MyEnum(String name) {
this.name = name;
}
private String name;
protected String name() {
return name;
};
@Override
public final String toString() {
return name().replace("_", " ");
}
}
public final static class Example1 extends MyEnum<Example1> {
public static final Example1 HELLO_WORLD = new Example1("HELLO_WORLD");
protected Example1(String name) {
super(name);
}
}
在Java8中,我们可以使用接口拉入方法,这样您现在可以通过一种继承形式向枚举添加功能
public interface HasName {
public String name();
}
public interface PoliteEnum extends HasName {
default String politeName() {
return name().replace("_", " ");
}
}
public enum X implements PoliteEnum {
A_For_Ism, B_For_Mutton, C_Forth_Highlanders;
}
public void test() {
for (X x : X.values()) {
System.out.println(x.politeName());
}
}
印刷品
A For Ism
B For Mutton
C Forth Highlanders
我承认它不如重写
toString
整洁,因为您不能重写默认值中的对象
方法,但它肯定会让您的枚举保持整洁。在打印枚举时使用助手方法。是否需要使用“枚举”?或者您可以将实现更改为类型安全枚举,以便进行一些继承吗?@Neel我明白您的意思,忘记Java枚举,使用Java实际识别枚举之前的方法。这是个好主意。更新了typesafe枚举指南。。。你可能需要填补空白。为什么我需要E?这个helper方法应该适用于任何枚举,不是吗?@Sotirios我也这么认为,但在这种情况下,我的团队和我必须记住使用helper类(我知道,我知道)。“答案是:”+enumInstance;自动为我调用toString(),并且已经分散在我的代码中。在本例中,您可以将.toString()
替换为.name()
,因为默认情况下,这是枚举
does@Flappjakk您不需要E
,您可以使用通配符(我只是尽量避免使用它们)。Java8很快就会出现,寻找最佳解决方案。
String asString = toString(ANSWER_1);
public abstract class MyEnum<E extends MyEnum<E>> {
protected MyEnum(String name) {
this.name = name;
}
private String name;
protected String name() {
return name;
};
@Override
public final String toString() {
return name().replace("_", " ");
}
}
public final static class Example1 extends MyEnum<Example1> {
public static final Example1 HELLO_WORLD = new Example1("HELLO_WORLD");
protected Example1(String name) {
super(name);
}
}
System.out.println(Example1.HELLO_WORLD);
public interface HasName {
public String name();
}
public interface PoliteEnum extends HasName {
default String politeName() {
return name().replace("_", " ");
}
}
public enum X implements PoliteEnum {
A_For_Ism, B_For_Mutton, C_Forth_Highlanders;
}
public void test() {
for (X x : X.values()) {
System.out.println(x.politeName());
}
}
A For Ism
B For Mutton
C Forth Highlanders