【问题标题】:Should toString() ever return null? [duplicate]toString() 应该返回 null 吗? [复制]
【发布时间】:2018-04-24 23:49:14
【问题描述】:

如果无法进行转换,java 中的方法 toString() 是否应该返回 null,或者在这种情况下它应该返回一个空字符串?

【问题讨论】:

  • 我认为toString 应该总是返回一些有用的东西——如果用于调试,这是主要的情况。就个人而言,我会依靠“格式化程序”将对象格式化为特定的String 表示以供显示 - 恕我直言。没有更多上下文,每个“规则”都有一个例外
  • 这样的对象是什么?如果没有好的字符串表示,你不能只使用默认实现吗?
  • 感谢您发现这是重复的,标题有点难以搜索。

标签: java string tostring


【解决方案1】:

null 不是字符串,所以这里不允许返回。检查 Java 文档:

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

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

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

【讨论】:

    【解决方案2】:

    toString() 返回 null 将是非常糟糕的 API 设计。显然,如果您能够在其上调用toString(),则该对象显然不为空。否则,会有一个NullPointerException

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

    【讨论】:

    • 恕我直言,将toString() 的返回用于任何类型的“真实逻辑”,尤其是使用它作为 [unique] 键 会比较礼貌地说, 不明智的
    • @KevinAnderson 是的。我不容忍它。但是我已经看到遗留系统依赖它,这正是我提到的用例。在这种情况下,如果空字符串是预期的表示形式就可以了。但是toString() 返回 null 只会让我退出。
    • 遗留系统......甚至不要让我开始!
    【解决方案3】:

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

    返回: 对象的字符串表示形式。

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

    虽然这不排除重写方法返回 null 的可能性,但任何这样做的程序员都应该期望可能在该代码上运行的工具和框架会产生大量 NPE。

    我的意见:不要这样做。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 2010-10-31
      相关资源
      最近更新 更多