我创建了一个枚举,我正在尝试允许我的枚举支持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);
}
};
}
}
答案 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()
清楚地表达了这一点。