如果字符串在代码中传递,我应该使用null还是空字符串?(Java最佳实践)
我有一个字符串,它在API中是可选的。如果我没有得到该参数,我就不确定是应该使用空的如果字符串在代码中传递,我应该使用null还是空字符串?(Java最佳实践),java,Java,我有一个字符串,它在API中是可选的。如果我没有得到该参数,我就不确定是应该使用空的字符串还是null值。该值在许多函数中传递,并在其中一些函数中使用 我一直在思考这个问题,这就是我想到的 使用null可能会更好,因为如果开发人员试图使用NPE而不检查它是否存在,它会抛出NPE“不会这样做,因此开发人员可能会认为他在使用不存在的字符串 使用“可能更好,因为如果开发人员想要更改某些内容,他/她不需要检查空指针。当开发人员不需要知道值是否存在(如更改字符串的编码)时,这可能是有益的 在这种情况下
字符串
还是null
值。该值在许多函数中传递,并在其中一些函数中使用
我一直在思考这个问题,这就是我想到的
- 使用
可能会更好,因为如果开发人员试图使用NPE而不检查它是否存在,它会抛出NPE<代码>“不会这样做,因此开发人员可能会认为他在使用不存在的字符串null
- 使用
可能更好,因为如果开发人员想要更改某些内容,他/她不需要检查空指针。当开发人员不需要知道值是否存在(如更改字符串的编码)时,这可能是有益的“
编辑:我正在寻找一种方法优于另一种方法的原因。而且
可选听起来很有趣。空字符串肯定比空字符串好。如果要指示该设置是可选的,并提供不同的行为,请使用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("");