Java Enum toString()方法

我有几个使用下划线来分隔单词的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()方法?

 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> { 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 { public static final Example1 HELLO_WORLD = new Example1("HELLO_WORLD"); protected Example1(String name) { super(name); } } 

用法:

 System.out.println(Example1.HELLO_WORLD); 

在Java 8中,我们可以使用接口引入方法,因此您现在可以通过一种inheritanceforms实际向枚举添加function。

 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一样整洁,因为你不能在default覆盖Object方法,但它肯定会让你的enum变得整洁。

声明一些辅助方法就好

 public static > String toString(Enum value) { return value.name().replace("_", ""); // use name() as suggested in comments } 

每当您想要打印enum ,请使用它

 String valueToPrint = YourHelperClass.toString(Example2.ANSWER_1); 

在Java 8中,您可以使用具有所有枚举实现的默认实现的接口(但不要覆盖)。