toString() 应该 return 为 null 吗?

Should toString() ever return null?

如果无法进行转换,java 中的方法 toString() 应该 return 为 null 还是应该 return 在这种情况下改为空字符串?

toString() 返回 null 是非常糟糕的 API 设计。显然,如果您能够对其调用 toString(),则该对象显然不为空。否则,就会出现 NullPointerException.

这实际上取决于对象和用例。如果您使用 toString() 来执行真正的逻辑,则空字符串是可以的 - 例如,如果您使用 toString() 作为键值存储的键。如果单纯用于debugging/logging。只需打印出所有字段。例如,类似于 MoreObjects.toStringHelper() 所做的事情。

null 不是 String,所以这里不允许 return。检查 Java 文档:

Returns a string representation of the object. In general, the toString method returns a string that "textually represents" this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.

它应该 return 对象的有意义的字符串表示形式。我写了一个例子来说明如何使用它以及它为什么有用:

public class Car {
    private String make;
    private int year;
    public Car(String make, int year) {
        this.make = make;
        this.year = year;
    }    

    @Overrride
    public String toString() {
        return "Car Make:" + make + "; Built Year: " + year;
    }
}

示例:

Car myCar = new Car("Nissan", 1999);
Car yourCar = new Car("BMW", 2018);
System.out.println(myCar);  // call toString() implicitly
System.out.println(yourCar);

它将打印 2 行,您可以轻松阅读文本并知道哪辆是您的车!

Car Make:Nissan; Built Year: 1999
Car Make:BMW; Built Year: 2018

Java API 文档,我检查过的每个最新版本都说:

Returns: a string representation of the object.

换句话说,null 不是定义的 return 值。如果您不重写 toString() 方法,那么您将始终得到一个至少为您提供对象 ID 的字符串。

虽然这不排除重写方法 returning null 的可能性,但任何这样做的程序员都应该期望工具和框架会产生很多 NPE可能正在对该代码进行操作。

我的意见:不要这样做。

我的问题:什么样的对象不能用字符串表示?