我有几个使用下划线分隔单词的Java枚举。在我的每个枚举中,我有一个toString方法,它实现为super.toString()。replace(“_”,“”),这样我就可以在没有下划线的GUI上显示字符串值。有没有什么方法可以让我的所有枚举使用这个toString方法,而不是在所有这些方法中重复它?如果这是一个常规类,答案很简单,实现toString()然后让我所有需要该实现的类扩展该类,但枚举不能扩展任何东西,甚至不能扩展枚举。
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()方法的解决方案?
答案 0 :(得分:5)
在Java 8中,我们可以使用接口来引入方法,因此您现在可以通过一种继承形式实际向枚举添加功能。
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
那样整洁,因为您无法覆盖Object
中的default
方法,但它肯定会让您enum
整洁。
答案 1 :(得分:1)
声明一些辅助方法,如
public static <E extends Enum<E>> String toString(Enum<E> value) {
return value.name().replace("_", ""); // use name() as suggested in comments
}
每当您想要打印enum
时,请使用
String valueToPrint = YourHelperClass.toString(Example2.ANSWER_1);
在Java 8中,您可以使用具有所有枚举实现的默认实现的接口(但不要覆盖)。
答案 2 :(得分:1)
public static String toString(Enum<?> enumVal) {
return String.valueOf(enumVal).replace("_", " ");
}
用法:
String asString = toString(HELLO_WORLD);
,或者
String asString = toString(ANSWER_1);
Typesafe方法:
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);