将变量赋值为null的最佳替代方法是什么?

时间:2015-06-26 18:43:07

标签: java null refactoring

当我编码时,我经常将我的变量指定为null,以便稍后我可以使用此信息。将我的变量赋值为null允许我指定变量的状态是无效的,这样做允许我稍后在程序中检查所述变量的有效性。

然而,当我将变量赋值为null时,我的代码静态分析工具(如PMD)会大声说明这是代码气味,我应该考虑重构。

所以我的问题如下:当你想要将这个变量指定为无效状态时,将变量赋值为null的最佳替代方法是什么?

7 个答案:

答案 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()。根据您的对象,您可以使用返回truefalse的方法,具体取决于objects状态是空还是空。这允许您不使用nulls。您可以将object初始化为empty州。只需谷歌null与空,你会发现很多信息。 Collections是另一个可以返回empty个对象(在这种情况下为列表,集合或映射)的示例:

Collections.emptyList()
Collections.emptySet()
Collections.emptyMap()

Java Prefer Empty to Null Link

Avoid Nulls 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)

如果您将该变量用于条件目的,则应使用布尔值。

相关问题