Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果字符串在代码中传递,我应该使用null还是空字符串?(Java最佳实践)_Java - Fatal编程技术网

如果字符串在代码中传递,我应该使用null还是空字符串?(Java最佳实践)

如果字符串在代码中传递,我应该使用null还是空字符串?(Java最佳实践),java,Java,我有一个字符串,它在API中是可选的。如果我没有得到该参数,我就不确定是应该使用空的字符串还是null值。该值在许多函数中传递,并在其中一些函数中使用 我一直在思考这个问题,这就是我想到的 使用null可能会更好,因为如果开发人员试图使用NPE而不检查它是否存在,它会抛出NPE“不会这样做,因此开发人员可能会认为他在使用不存在的字符串 使用“可能更好,因为如果开发人员想要更改某些内容,他/她不需要检查空指针。当开发人员不需要知道值是否存在(如更改字符串的编码)时,这可能是有益的 在这种情况下

我有一个字符串,它在API中是可选的。如果我没有得到该参数,我就不确定是应该使用空的
字符串
还是
null
值。该值在许多函数中传递,并在其中一些函数中使用

我一直在思考这个问题,这就是我想到的

  • 使用
    null
    可能会更好,因为如果开发人员试图使用NPE而不检查它是否存在,它会抛出NPE<代码>“不会这样做,因此开发人员可能会认为他在使用不存在的字符串
  • 使用
    可能更好,因为如果开发人员想要更改某些内容,他/她不需要检查空指针。当开发人员不需要知道值是否存在(如更改字符串的编码)时,这可能是有益的
在这种情况下,最佳做法是什么


编辑:我正在寻找一种方法优于另一种方法的原因。而且
可选
听起来很有趣。

空字符串肯定比空字符串好。如果要指示该设置是可选的,并提供不同的行为,请使用
optional

在我看来,如果
不是该参数的有效值,请使用
。否则使用
null

关于您的第一点,如果您尝试对空字符串进行子串或调用
charAt
或诸如此类的操作,您将得到一个
IndexOutOfRangeException
。所以我不认为它会鼓励在不检查空字符串的情况下使用它。有很多方法可以预防NPE


另一种选择是
可选
,但我认为目前它的语法看起来太难看了。如果它被认为是无效值,我仍然会使用它。

如果您在API中返回空字符串,则使用它的开发人员完全可能忘记检查它的值是否为
null
。正如Joop在回答中已经提到的,使用
可选

这迫使API的使用者检查它是否存在(或者至少考虑如何处理它的缺失),例如:


我在寻找一个比另一个好的原因。我认为空字符串不会抛出错误,它可能会隐藏代码中的问题。您在问题中也说过:no NullPointerException,如果您希望对非自提供值进行处理,那么
Optional
应该是一种更好的机制。现在不再有理由冒NPE的风险了。让开发人员知道NPE的值为空不是一件好事吗?如果没有NPE,代码就不会隐藏问题吗?问题是,值可能首先被传递,因此不会出现快速故障,错误变得模糊。可能会出现字符串“null”。可选选项使用法更加明确,最好使用
参数。ifPresent(value->…)
我的答案是“使用默认值的非空字符串”或可选。这两个选项的决定取决于您想要施加的努力,必须是值得的。可空对象不再有理由存在于正常代码中。
myAPI.ifPresent(/* do something with String */);
myAPI.map(String::toLowerCase).orElse("");