你喜欢什么;nk关于Java设计器决定Java.lang.String.valueOf((Object)null)返回;空";但不是",&引用;

你喜欢什么;nk关于Java设计器决定Java.lang.String.valueOf((Object)null)返回;空";但不是",&引用;,java,effective-java,Java,Effective Java,[在协调世界时2020/07/27 01:30编辑此问题] 您认为Java设计器如何决定Java.lang.String.valueOf((Object)null)返回“null”,但不返回“”,这是文本的长度0 我认为”文本比“null”文本好,而不是null文本 我已经理解了null和“是不同的, 但有时“和null表示程序上的空值 实际上,org.apache.commons.lang3.StringUtils.isEmpty(),如果值为”或null,则返回true。 如果String.

[在协调世界时2020/07/27 01:30编辑此问题]

您认为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,我们有时使用
[]
数组而不是null数组<代码>新字符串((char)[])返回
“”


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

它与调用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”)
。因此,它归结为判断哪一个是更常见的需要。

“空”与“空”完全不同。null表示您从未设置变量的值,而当您有一个值为“”的变量时,则表示您曾经将该变量设置为某个值,即使该值为“”

一些提示:

Tony Hoare在设计ALGOL时引入了空引用,此后许多语言都采用了这种方法,但Hoare称之为空引用,
由于它的缺陷,许多语言不再使用它。Java8引入了
Optional
类型。要解决这些问题,请使用它。

查看方法的代码。或者阅读文档:
如果参数为null,则返回一个等于“null”的字符串;否则,将返回obj.toString()的值。
@Abra的问题不是“如何”,而是“为什么”(现在的意义是“代码如何工作”,而是“为什么Java设计人员决定这样做”)。一个答案是“为什么”是因为文档(外部规范)如果你想窥探语言设计者的想法,那就更难了。我猜在许多对象的打印输出中很难区分“”和“null”“被认为更好、更容易阅读。问问写这种方法的人,为什么她决定这样写。Null与空字符串不同,即长度为零的字符串。小细节:at“它与调用Object.toString(Null)一致。”您可能指的是
对象.toString
(键入,在
之前没有
s
。toString
)。但是由于
Objects.toString
内部只
返回String.valueOf(o)
可以更准确地说
Objects.toString
String.valueOf
一致。String.valueOf方法比Objects类古老得多。