繁体   English   中英

Java Enum toString()方法

[英]Java Enum toString() method

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

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

声明一些辅助方法就好

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中,您可以使用具有所有枚举实现的默认实现的接口(但不要覆盖)。

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM