Java:枚举类型 toString()方法

6
我创建了一个枚举,我正在尝试使它支持String.format操作,该操作可以获取无限数量的参数并返回一个字符串。 我只能够返回一个对象,然后使用此方法之后我必须执行toString()/转换。 我猜想有一种更好的方法来完成这个任务,或者可能更好地覆盖toString()方法。 基本上,我想要支持toString()方法,但可悲的是我没有成功,因此我创建了这个方法。 如您所见,它的名称是text(..),而不是toString()。

如何更好地实现这个功能? 我想要的理想解决方案是类似于返回一个String的toString(..)。

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

3
我不明白你想实现什么。既然这个方法并没有使用任何枚举实例中的内容,为什么要将其作为一个枚举的实例方法? - JB Nizet
1
这个方法与你的枚举有什么关系?你想让它返回什么? - darrengorman
我扩展了我的代码,尝试使用几个给定的字符串参数支持toString()方法。 - Popokoko
2个回答

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

顺便说一下,我真的很喜欢这个概念。以前没见过。


很棒的解决方案,完美地运作着。嗯,我自己也快要解决了,非常感谢! - Popokoko
我也喜欢这个想法,不过我更倾向于使用类似 anEnumValue.format(Object o) 的函数。对我来说,“toString”应该返回枚举值本身的字符串表示形式,因此 VALUE_A 应该像“aaa <object toString> bbb <objecttoString>”这样。 - thecoshman
@thecoshman,如果没有参数(即覆盖Object的实现),toString()确实是这样的,但是带有参数的toString()可以随心所欲地执行。 JDK中有许多使用此模式的示例,例如Integer.toString(int) - Bohemian
@Bohemian 说得很好,尽管我们现在当然是在争论语义。在这种情况下,我仍然更喜欢使用.format(...)而不是.toString(...) - thecoshman

4

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

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

您不应该将此方法命名为toString(),因为这会令人困惑,您并没有返回当前对象的字符串表示形式,而是返回传递参数的对象的格式化字符串。此外,text()方法应该被称为getText(),这是Java的惯例。
最好使用一个名称,清楚地表明返回的字符串不是任何字符串 - 它是一个格式化的字符串,期望文本作为参数进行格式化 - getAsFormattedText()清楚地表达了这一点。

当有人不想传递任何参数但又使用无参的toString方法时,会让人感到非常困惑。 - mP.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接