【问题标题】:What do you thínk about Java designers decided java.lang.String.valueOf((Object)null) returns "null" but not "" [closed]您如何看待 Java 设计师决定 java.lang.String.valueOf((Object)null) 返回“null”而不是“”[关闭]
【发布时间】:2020-07-26 18:14:07
【问题描述】:

[在 2020/07/27 01:30 UTC 编辑了这个问题]

您如何看待 Java 设计人员决定 java.lang.String.valueOf((Object)null) 返回 "null" 而不是长度为 0 文本的 ""

我认为"" 文字优于"null" 文字而不是null 文字。

我已经明白null""是不同的, 但有时""null 表示程序上的空值。

实际上,org.apache.commons.lang3.StringUtils.isEmpty() 如果值为""null,则返回true。 如果String.valueOf(null) 返回""String.valueOf(null).isEmpty() 返回true

为了避免 NullPointerException,我们有时使用[] 数组而不是空数组。 new String((char)[]) 返回""

我认为“零”的含义是“无”,所以null的长度应该是0。

【问题讨论】:

  • 看方法的代码
  • 或阅读文档:if the argument is null, then a string equal to "null" [is returned]; otherwise, the value of obj.toString() is returned.docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/…
  • @Abra 问题不是“如何”而是“为什么”(现在的意思是“代码如何工作”而是“为什么 Java 设计者决定它这样做”) .
  • 一个答案是“为什么”是因为文档(外部规范)是这样说的。如果你想窥探语言设计者的想法,那就更难了。我猜想“”在打印出许多对象时很难区分,“null”被认为更好更容易阅读。
  • 问问写方法的人为什么她决定这样写。 Null 与空相同,即零长度,字符串。

标签: java effective-java


【解决方案1】:

与调用 Object.toString(null) 一致。

为什么这个特定的结果很重要?我认为在将对象转换为字符串时,获取“null”而不是空字符串更有用。

例如,如果您调用

System.out.printf("the value is %s", obj);

如果 obj 为 null,那么一般来看似乎更有用

the value is null

而不是

the value is

如果你想要不同的东西,你可以编码valueOf(obj != null ? obj : "")。当然,对于相反的决定也可以提出相同的论点——你可以写valueOf(obj != null ? obj : "null")。因此,它归结为判断哪个是更常见的需求。

【讨论】:

  • 小挑剔:在“与调用 Object.toString(null) 一致”。你可能是指Objects.toString(错别字,在.toString之前没有s)。但由于Objects.toString 内部只是return String.valueOf(o);,所以说Objects.toStringString.valueOf 一致可能更准确。
  • String.valueOf 方法比 Objects 类要古老得多。
【解决方案2】:

“null”与“”完全不同。 null 意味着您永远不会设置变量的值,而当您有一个具有“”值的变量时,这意味着您曾经将该变量设置为某个值,即使该值是“”。

一些提示:

Tony Hoare 在设计 ALGOL 时引入了空引用,之后许多语言都遵循了这种方法,但 Hoare 称之为 "my billion dollar mistake", 由于它的缺陷,许多语言不再使用它。 Java 8 引入了Optional 类型。要解决这些问题,请改用它。

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 1970-01-01
    • 2010-11-19
    • 2011-12-23
    • 1970-01-01
    • 2014-07-28
    • 2021-11-10
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多