Java Enum toString()方法

Java Enum toString()方法,java,enums,Java,Enums,我有几个Java枚举使用下划线分隔单词。在我的每个枚举中,我都有一个toString方法,它被实现为super.toString().replace(““,”),这样我就可以在GUI上显示字符串值,而不需要下划线。有没有什么方法可以让我所有的枚举都使用这个toString方法,而不用在所有枚举中重复它?如果这是一个常规类,答案很简单,实现toString(),然后让我所有需要该实现的类扩展该类,但枚举不能扩展任何内容,甚至不能扩展另一个枚举 public enum Example1 {

我有几个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 <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