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

Jes*_*rce 11 java overriding

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

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

喜欢:

@Override
public String toString() {
    .......
    return null;
}
Run Code Online (Sandbox Code Playgroud)

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

Object.toString()的API文档说:

public String toString()

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

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

Nat*_*hes 11

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

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

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

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

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


And*_*mas 7

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

第4.3.1节:对象

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

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

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