将变量分配给 null 的最佳替代方法是什么?
What would be the best alternative to assigning a variable to null?
当我编码时,我经常将我的变量分配给 null 以便我以后可以使用这些信息。将我的变量分配给 null 允许我指定变量的状态是无效的,这样做允许我稍后在程序中检查所述变量的有效性。
但是,我的代码静态分析工具,例如 PMD,在我将一个变量赋值给 null 时大喊大叫,说这是一种代码味道,我应该考虑重构。
所以我的问题如下:当您想将变量指定为无效状态时,将变量赋值给 null 的最佳替代方法是什么?
这取决于变量的类型。通常 null 是所有变量的通用选项。然而,我见过的最好的选择是将 var 分配给 rarely/very-unlikely 曾经被使用过的东西。
例如:
字符串 str = "I AM NULL";
int num = MIN_INT;(忘了具体调用MIN_INT的方法了,不过思路是一样的)
然后您将在每种情况下检查这些值。
如果您将该变量用于条件用途,则应使用布尔值。
null
的另一种选择是 empty
状态。例如 String
对象可以是 empty
它甚至有一个方法来检查它是否为空 String.isEmpty()
。根据您的对象,您可以使用 returns true
或 false
的方法,具体取决于 objects
状态是否为空。这允许您不使用 nulls
。您可以将 object
初始化为 empty
状态。只是 google null 与 empty,你会发现很多信息。 Collections
是另一个可以 return empty
对象(在本例中为列表、集合或映射)的示例:
Collections.emptyList()
Collections.emptySet()
Collections.emptyMap()
Java Prefer Empty to Null Link
综上所述,在某些情况下 null
仍然有用。这在很大程度上取决于您的编程风格和具体情况。 null
有助于测试,因为您的应用程序会因 NPE
而崩溃,因此您将能够检测到错误...其中 empty
对象可能导致 logical
错误有时更难被发现。由程序员决定什么是最适合每种情况的...
如果你想要一个 empty
对象和一个 isEmpty()
方法,你只需要决定 "empty" 在你的对象情况下意味着什么。然后你可以围绕什么构成你的自定义 class object
为空建立你自己的规则。
您可以使用 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("")
初始化一个可选的
我所做的是为变量分配一个您知道永远不会使用的值。
例如我曾经给一个字符串赋值:"DELETED",我知道它永远不会出现。这样既可以处理PMD,又可以避免一些潜在的NullPointerException。
我最喜欢的方法之一是 Null Object Pattern。这是一个正确类型的对象(非空)——通常是所讨论类型的子类——它对空的行为是正确的。也就是说,如果您对其调用方法,则不会发生任何事情,但与真正的 null 不同,它不会引发异常。
分配 null 的问题是 null 可以有多种含义:变量(或字段)未初始化、值不存在或不适用。因此,程序员需要记住(或发现)null 在特定上下文中的含义。
备选方案是使用空对象模式或使用选项类型(参见 Java 中的可选 class)。
这篇维基百科文章涵盖了所有内容:https://en.wikipedia.org/wiki/Nullable_type
现在回到 PMD,我认为由您的团队决定是否要遵循此规则以及如何修复它。
当我编码时,我经常将我的变量分配给 null 以便我以后可以使用这些信息。将我的变量分配给 null 允许我指定变量的状态是无效的,这样做允许我稍后在程序中检查所述变量的有效性。
但是,我的代码静态分析工具,例如 PMD,在我将一个变量赋值给 null 时大喊大叫,说这是一种代码味道,我应该考虑重构。
所以我的问题如下:当您想将变量指定为无效状态时,将变量赋值给 null 的最佳替代方法是什么?
这取决于变量的类型。通常 null 是所有变量的通用选项。然而,我见过的最好的选择是将 var 分配给 rarely/very-unlikely 曾经被使用过的东西。
例如:
字符串 str = "I AM NULL";
int num = MIN_INT;(忘了具体调用MIN_INT的方法了,不过思路是一样的)
然后您将在每种情况下检查这些值。
如果您将该变量用于条件用途,则应使用布尔值。
null
的另一种选择是 empty
状态。例如 String
对象可以是 empty
它甚至有一个方法来检查它是否为空 String.isEmpty()
。根据您的对象,您可以使用 returns true
或 false
的方法,具体取决于 objects
状态是否为空。这允许您不使用 nulls
。您可以将 object
初始化为 empty
状态。只是 google null 与 empty,你会发现很多信息。 Collections
是另一个可以 return empty
对象(在本例中为列表、集合或映射)的示例:
Collections.emptyList()
Collections.emptySet()
Collections.emptyMap()
Java Prefer Empty to Null Link
综上所述,在某些情况下 null
仍然有用。这在很大程度上取决于您的编程风格和具体情况。 null
有助于测试,因为您的应用程序会因 NPE
而崩溃,因此您将能够检测到错误...其中 empty
对象可能导致 logical
错误有时更难被发现。由程序员决定什么是最适合每种情况的...
如果你想要一个 empty
对象和一个 isEmpty()
方法,你只需要决定 "empty" 在你的对象情况下意味着什么。然后你可以围绕什么构成你的自定义 class object
为空建立你自己的规则。
您可以使用 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("")
初始化一个可选的我所做的是为变量分配一个您知道永远不会使用的值。
例如我曾经给一个字符串赋值:"DELETED",我知道它永远不会出现。这样既可以处理PMD,又可以避免一些潜在的NullPointerException。
我最喜欢的方法之一是 Null Object Pattern。这是一个正确类型的对象(非空)——通常是所讨论类型的子类——它对空的行为是正确的。也就是说,如果您对其调用方法,则不会发生任何事情,但与真正的 null 不同,它不会引发异常。
分配 null 的问题是 null 可以有多种含义:变量(或字段)未初始化、值不存在或不适用。因此,程序员需要记住(或发现)null 在特定上下文中的含义。
备选方案是使用空对象模式或使用选项类型(参见 Java 中的可选 class)。 这篇维基百科文章涵盖了所有内容:https://en.wikipedia.org/wiki/Nullable_type
现在回到 PMD,我认为由您的团队决定是否要遵循此规则以及如何修复它。