我是否滥用toString()?

时间:2017-11-14 01:02:08

标签: java combobox tostring

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;做这项工作,但它造成了大量的代码重复。

在我决定哪种方法最好之前,我会仔细考虑这几天。非常感谢大量的评论和回答。

1 个答案:

答案 0 :(得分:0)

对于Swing,您肯定需要覆盖某些类的toString方法。这就是Swing模型对象的工作方式。 (不要使用单元格渲染器将值转换为String;这将破坏JTable的可访问性,键盘导航和内置排序。)

通常,您希望将显示逻辑与数据分开,例如通过创建包装类,但是因为您只是返回属性的原始值(而不是格式化它或将其与其他信息连接)你正在做的事情很好。

JavaFX是另一回事:控件使用单元工厂回调对象来确定单元格中出现的文本,因此数据类可能不应在JavaFX应用程序中使用显示值覆盖toString

我不熟悉IDE自动生成的toString方法,但在我看来,在toString方法中将对象转换为JSON是一个可怕的想法。 Swing模型对象应该有一个toString方法,它返回一个人类可读的对象形式;大多数其他类应该返回一个单行字符串,其中包含对象状态的摘要(不必是对象中的每个属性),如getClass().getName() + "[" + getName() + "]"

总之,你没有滥用toString。对于Swing,你做的是正确的。对于JavaFX,最好返回一个对调试有用的字符串。