6

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

我怎样才能做得更好?我想要的理想解决方案是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);
            }
        };
    }
}
4

2 回答 2

9

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

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

从设计的角度来看,除非您确实需要,否则我不会text发布文本(即具有 getter)-用作格式字符串的事实是一种实现选择。我会这样做:

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

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

于 2012-04-18T18:48:33.883 回答
4

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

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

你不应该命名这个方法toString(),它会令人困惑,因为你没有返回当前对象的字符串表示,而是返回作为参数传递的对象的格式化字符串。此外,text()应该调用该方法getText(),这是 Java 约定。

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

于 2012-04-18T18:48:36.367 回答