Object.toString()
的Javadoc说:
返回对象的字符串表示形式。一般来说,
toString
方法返回一个"文本表示"的字符串。这个 宾语。结果应该是简洁但信息丰富的表示 一个人很容易阅读。建议所有人 子类重写此方法。类Object的toString方法 返回一个字符串,该字符串由其类的名称组成 object是一个实例,at-sign字符'@'
和unsigned 对象哈希码的十六进制表示。其他 单词,此方法返回一个等于值的字符串:
getClass().getName() + '@' + Integer.toHexString(hashCode())
因此,当我覆盖toString()
类的Foo
时,我正在质疑自己是否滥用此功能只是为了使ComboBox控件(并不重要)&#39 ; s JavaFX或Swing控件)可以正确呈现Foo
列表,而无需在ComboBox中做任何明确的操作。
class Foo {
private String name;
public final String getName() { return name; }
public final void setName(String n) { name = n; }
@Override
public String toString() {
return name;
}
}
List<Foo> foos = getFoos(); // Get list of Foos from somewhere
ComboBox comboBox = ....; // Some ComboBox control
comboBox.addItems(foos); // Add the list to the ComboBox
大多数IDE生成的toString()
的默认实现是类的JSON表示。我怀疑这允许类对象的简单序列化/反序列化。虽然我不需要通过这种方法序列化或反序列化,但我绝对会通过覆盖这样的方式来打破这种可能性。
我已经阅读了很多人的评论,以及VGR给出的答案。我可以看到普遍的共识是,对此没有严格的规则。我发现人们普遍认为toString()
最好留给调试目的。
我这样做的最大原因&#34; hack&#34;是因为我在很多不同的地方都有ComboBox
。当然,无可争辩的正确和干净的方法是使用&#34;渲染器&#34;做这项工作,但它造成了大量的代码重复。
在我决定哪种方法最好之前,我会仔细考虑这几天。非常感谢大量的评论和回答。
答案 0 :(得分:0)
对于Swing,您肯定需要覆盖某些类的toString
方法。这就是Swing模型对象的工作方式。 (不要使用单元格渲染器将值转换为String;这将破坏JTable的可访问性,键盘导航和内置排序。)
通常,您希望将显示逻辑与数据分开,例如通过创建包装类,但是因为您只是返回属性的原始值(而不是格式化它或将其与其他信息连接)你正在做的事情很好。
JavaFX是另一回事:控件使用单元工厂回调对象来确定单元格中出现的文本,因此数据类可能不应在JavaFX应用程序中使用显示值覆盖toString
。
我不熟悉IDE自动生成的toString方法,但在我看来,在toString方法中将对象转换为JSON是一个可怕的想法。 Swing模型对象应该有一个toString方法,它返回一个人类可读的对象形式;大多数其他类应该返回一个单行字符串,其中包含对象状态的摘要(不必是对象中的每个属性),如getClass().getName() + "[" + getName() + "]"
。
总之,你没有滥用toString。对于Swing,你做的是正确的。对于JavaFX,最好返回一个对调试有用的字符串。