当我编码时,我经常将我的变量指定为null,以便稍后我可以使用此信息。将我的变量赋值为null允许我指定变量的状态是无效的,这样做允许我稍后在程序中检查所述变量的有效性。
然而,当我将变量赋值为null时,我的代码静态分析工具(如PMD)会大声说明这是代码气味,我应该考虑重构。
所以我的问题如下:当你想要将这个变量指定为无效状态时,将变量赋值为null的最佳替代方法是什么?
答案 0 :(得分:2)
您可以使用Java 8中引入的可选框架。
Optional<String> str = foo() // Method that returns an optional String
if(!str.isPresent()){
// Invalid state
}else{
String validStr = str.get();
// Valid state
}
您使用 Optional.of(&#34;&#34;)
初始化可选项答案 1 :(得分:1)
null
的另一种替代方法是empty
州。例如,String
对象可以是empty
它甚至有一个方法来检查它是否为空String.isEmpty()
。根据您的对象,您可以使用返回true
或false
的方法,具体取决于objects
状态是空还是空。这允许您不使用nulls
。您可以将object
初始化为empty
州。只需谷歌null与空,你会发现很多信息。 Collections
是另一个可以返回empty
个对象(在这种情况下为列表,集合或映射)的示例:
Collections.emptyList()
Collections.emptySet()
Collections.emptyMap()
Java Prefer Empty to Null Link
所有这些说法仍然存在null
有用的情况。很多都取决于您的编程风格和具体情况。 null
可能有助于测试,因为您的应用程序会因NPE
而崩溃,因此您将能够发现错误... empty
对象可能导致logical
错误有时难以发现。由程序员决定每种情况的最佳状态......
如果你想拥有一个empty
对象isEmpty()
方法,你只需要决定&#34;清空&#34;意味着你的对象情况。然后,您可以围绕自定义类object
的构成建立自己的规则为空。
答案 2 :(得分:1)
我最喜欢的方法之一是Null Object Pattern。这是一个正确类型的对象(非null) - 通常是所讨论类型的子类 - 它对null的行为正确。也就是说,如果你在它上面调用一个方法,没有任何反应,但与真正的null不同,它不会引发异常。
答案 3 :(得分:1)
赋值null的问题是null可以有几个含义:变量(或字段)未初始化,值不存在或不适用。因此,程序员必须记住(或发现)null在特定上下文中的含义。
替代方法是使用null对象模式或使用选项类型(请参阅Java中的Optional类)。 这篇维基百科文章涵盖了所有内容:https://en.wikipedia.org/wiki/Nullable_type
现在回到PMD,我认为由您的团队决定是否要遵循此规则以及您希望如何修复它。
答案 4 :(得分:0)
这取决于变量的类型。通常null是所有变量的通用选项。然而,我所看到的最好的选择是将var分配给很少/非常不可能使用的东西。
例如:
String str =“I AM NULL”;
Int num = MIN_INT;(我忘记了对MIN_INT的实际方法调用,但想法是一样的。)
然后你会在每种情况下检查这些值。
答案 5 :(得分:0)
我所做的是为变量分配一个您知道自己永远不会使用的值。
e.g。我过去常常给字符串赋值:&#34; DELETED&#34;,我知道其他情况不会出现。这样它不仅可以处理PMD,还可以避免一些潜在的NullPointerExceptions。
答案 6 :(得分:-1)
如果您将该变量用于条件目的,则应使用布尔值。