我有几个使用下划线分隔单词的Java枚举。在我的每个枚举中,我都有一个toString方法,该方法实现为super.toString()。replace(“ _”,“”),这样我就可以在GUI上显示String值而没有下划线。有什么办法可以让我的所有枚举都使用此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()方法?
public static String toString(Enum<?> enumVal) { return String.valueOf(enumVal).replace("_", " "); }
用法:
String asString = toString(HELLO_WORLD);
要么,
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);
在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整洁。
toString
Object
default