【问题标题】:What would be the best alternative to assigning a variable to null?将变量分配给 null 的最佳选择是什么?
【发布时间】:2018-10-30 22:42:18
【问题描述】:

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

但是,我的代码静态分析工具(例如 PMD)在我将变量赋值为 null 时大喊大叫,说这是代码异味,我应该考虑重构。

所以我的问题如下:当您想将此变量指定为无效状态时,将变量分配给 null 的最佳替代方法是什么?

【问题讨论】:

标签: java null refactoring


【解决方案1】:

您可以使用 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("")

初始化一个可选项

【讨论】:

    【解决方案2】:

    我最喜欢的方法之一是Null Object Pattern。这是一个正确类型的对象(非 null)——通常是所讨论类型的子类——对于 null 行为正确。也就是说,如果您在其上调用方法,则不会发生任何事情,但与真正的 null 不同的是,它不会引发异常。

    【讨论】:

      【解决方案3】:

      null 的另一种替代方法是empty 状态。例如String 对象可以是empty 它甚至有一个方法来检查它是否为空String.isEmpty()。根据您的对象,您可以有一个返回truefalse 的方法,具体取决于objects 状态是否为空。这允许您不使用nulls。您可以将 object 初始化为 empty 状态。只需 google null vs. empty,您就会发现很多信息。 Collections 是另一个可以返回 empty 对象(在本例中为列表、集合或映射)的示例:

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

      Java Prefer Empty to Null Link

      Avoid Nulls Link

      尽管如此,null 在某些情况下仍然有用。很大程度上取决于您的编程风格和具体情况。 null 对测试很有帮助,因为您的应用程序将与 NPE 一起崩溃,因此您将能够检测到错误......其中 empty 对象可能导致 logical 错误,有时更难检测到。由程序员决定哪种情况最适合每种情况...

      如果你想拥有一个带有isEmpty() 方法的empty 对象,你只需要决定在你的对象情况下“空”是什么意思。然后,您可以围绕将自定义类 object 设为空的内容构建自己的规则。

      【讨论】:

        【解决方案4】:

        分配 null 的问题在于 null 可以有多种含义:变量(或字段)未初始化、值不存在或不适用。因此,程序员需要记住(或发现)null 在特定上下文中的含义。

        替代方案是使用空对象模式或使用选项类型(请参阅 Java 中的可选类)。 这篇维基百科文章涵盖了所有内容:https://en.wikipedia.org/wiki/Nullable_type

        现在回到 PMD,我认为由您的团队决定是否要遵循此规则以及如何修复它。

        【讨论】:

          【解决方案5】:

          这取决于变量的类型。通常 null 是所有变量的通用选项。然而,我见过的最好的选择是将 var 分配给很少/非常不可能使用的东西。

          例如:

          字符串 str = "我是 NULL";

          Int num = MIN_INT;(我忘记了对MIN_INT的实际方法调用,但思路是一样的)。

          然后您将检查每种情况下的这些值。

          【讨论】:

            【解决方案6】:

            我所做的是为变量分配一个你知道你永远不会使用的值。

            例如我曾经给一个字符串赋值:“DELETED”,我知道它永远不会出现。这样不仅可以处理 PMD,还可以避免一些潜在的 NullPointerExceptions。

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 2014-01-28
                • 2018-03-01
                • 2023-01-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-12-27
                • 1970-01-01
                相关资源
                最近更新 更多