当我们覆盖toString()方法时,我们应该总是返回对象的字符串表示形式吗?

时间:2015-09-03 14:21:21

标签: java override

实际上,toString方法应返回对象的String表示形式。

在一个项目中,我发现了一些覆盖toString方法的类,允许返回null。

像:

@Override
public String toString() {
    .......
    return null;
}

对我来说,这种做法违反了toString方法的主要建议,该方法应该返回对象的String表示。

Object.toString()的API文档说:

  

public String toString()

     

返回对象的字符串表示形式。一般来说,   toString方法返回一个“文本表示”的字符串   宾语。结果应该是简洁但信息丰富的表示   一个人很容易阅读。建议所有人   子类重写此方法。

当我们覆盖Object的toString()方法时,你永远不应该返回null?

6 个答案:

答案 0 :(得分:11)

toString主要用于表示受众是程序员的事情,比如调试和日志记录,我们需要查看对象的某些文本版本。当您在日志文件或调试器中看到对象时,使用对您有用的信息。从Effective Java,第3章,第10项:

  

虽然它不像遵守equals和hashCode合同那样重要(第8项,第9项),但提供良好的toString实现会使你的类更加愉快。将对象传递给println,printf,字符串连接运算符或断言,或由调试器打印时,会自动调用toString方法。

Object#toString的API文档中的建议是:

  

通常,toString方法返回一个"文本表示"的字符串。这个对象。结果应该是一个简洁但信息丰富的表示,便于人们阅读。建议所有子类都重写此方法。

返回null永远不会算作提供信息,并且很容易产生误导。似乎有人使用toString来做一些它从未打算过的事情。

答案 1 :(得分:6)

Java语言规范不禁止从toString()返回null。相反,它明确承认可以返回null。

Section 4.3.1: Objects

  

字符串连接运算符+(第15.18.1节),当给定String时   操作数和引用,将通过调用将引用转换为String   引用对象的toString方法(如果是引用,则使用“null”   或者toString的结果是空引用)

您引用的文字来自Object.toString()的API文档。和你一样,我读它时强烈暗示返回一个非null值。

返回非空值将是最有用的。返回null可能会在调试器中造成混淆,因此难以区分空引用和非常好的非空引用,以及来自toString()的遗憾的null返回值。

答案 2 :(得分:1)

只要应用程序实用,就应该覆盖toString()方法。

至于返回null,我发现完全没用,因为toString()主要在调试期间使用。所以不,你永远不应该从toString()方法返回null。

你无法修复愚蠢,但你可以从中学习。

答案 3 :(得分:0)

toString()是"人类"对象的呈现,像Nathan一样用于调试和#34;速度方法"应用程序中的演示文稿。

有时候人们会将序列化/反序列化(必须包括所有重要的(非瞬态)字段)与toString()混合,并且由于读取值的算法而准确。

答案 4 :(得分:0)

从我的观点来看,你不应该在toString()方法中返回null。

它没有提供信息也无法使用。相反,使用toString()方法为数据模型类实例返回正确且信息丰富的字符串将帮助您和您的团队成员使用您的类并将它们合并到更复杂的数据结构中。

答案 5 :(得分:-1)

这看起来像ToString()的自定义用法。这种覆盖方法完全基于用户试图根据他/她的需要实现的实现。 据我所知,只要用户期望返回此值,返回null就没有坏处,因为null可以存储在字符串数据类型中。

但是,除非你有充分的理由去做,否则覆盖ToString不是一个好习惯。