Java:enum toString()

时间:2012-04-18 18:35:13

标签: java string enums

我创建了一个枚举,我正在尝试允许我的枚举支持String.format操作,该操作获得无限数量的参数返回一个字符串。 我只设法返回一个对象,使用这个方法后我必须进行toString() / cast。我猜测有一种更“干净”的方法,或者可能更好地覆盖toString()方法。基本上,我想支持toString()方法,但遗憾的是没有设法这样做,所以我创建了这个方法。如您所见,它的名称为text(..),而不是toString()

我怎样才能更好地做到这一点?我想要的理想解决方案是toString(..),它返回一个String。

public enum MY_ENUM {

    VALUE_A("aaa %s"), VALUE_B("bbb %s");

    private String text;

    MY_ENUM(String text) {
        this.text = text;
    }

    public String text() {
        return this.text;
    }

    public Object text(final Object... o) {
        return new Object() {
            @Override
            public String toString() {
                return String.format(text(), o);
            }
        };
    }
}

2 个答案:

答案 0 :(得分:9)

我知道你要去哪里......我认为这就是你想要的(经过测试,并且有效):

public String toString(Object... o) {
    return String.format(text, o);
}

从设计的角度来看,我会发布文本(即拥有getter),除非你真的需要 - text被用作格式字符串的事实是实施选择。我只想这样做:

public static enum MY_ENUM {

    VALUE_A("aaa %s bbb %s"),
    VALUE_B("bbb %s");

    private final String text;

    MY_ENUM(String text) {
        this.text = text;
    }

    public String toString(Object... o) {
        return String.format(text, o);
    }
}

顺便说一句,我真的很喜欢上课的想法。以前没看过。

答案 1 :(得分:4)

如果您需要传递更多参数(toString()未收到任何参数),则无法覆盖toString()。只需在枚举中定义一个新方法,无需覆盖:

public String getAsFormattedText(Object... o) {
    return String.format(text, o);
}

您不应该将此方法命名为toString(),它会让您感到困惑,因为您没有返回当前对象的字符串表示形式,而是返回作为参数传递的对象的格式化字符串。此外,text()方法应该被称为getText(),这是Java惯例。

最好使用一个清楚地表明返回的字符串不是任何字符串的名称 - 它是一个格式化的字符串,希望将文本格式化为参数 - getAsFormattedText()清楚地表达了这一点。