静态实用方法 - 显式 NULL 检查与 @NonNull 与显式抛出
Static Utility Methods - explicit NULL check vs @NonNull vs explicit throws
问题基本上是针对静态实用程序 类,它存在于一个包中以向其他 类 提供某些功能。我举一个常见的例子 stripParenthesis()
Method 1. Explicit Null Check
public static String stripParenthesis(String str) {
if(str == null) {
return str;
}
return str.replaceAll("[()]",""); // remove paarenthesis
}
Method 2. Using Lombok's @NonNull
/* @NonNull will throw NPE */
public static String stripParenthesis(@NonNull String str) {
return str.replaceAll("[()]",""); // remove paarenthesis
}
Method 3. Explicit NPE
public static String stripParenthesis(String str) throws NullPointerException {
if(str == null) {
throw NPE();
}
return str.replaceAll("[()]",""); // remove paarenthesis
}
3种方法全部正确。我不喜欢第二种方法,因为它将 NPE 作为未经检查的异常抛出。调用者可能会意外失败。
这里有通用的约定吗?
方法 1. 显式 Null 检查。
if(str == null) {
return str;
}
你试图通过什么来实现返回null?通过将所需的空检查和行为委托回调用者来屏蔽错误。也许您认为返回 Optional.empty()
?
之类的东西
方法 2。使用 Lombok 的 @NonNull - 不是一个平等的选择。
这不是具有相关第三方框架问题的 java 标准的一部分。 javax 类似的注释是,但它们不强制进行空检查,它们主要是为静态分析器设计的。尽管如此,Lombok 是可靠的框架。
方法 3. 显式 NPE - 核心实体方法,它始终有效,如果你只是在这三个之间犹豫 - 使用它。
我不会使用方法 1,因为忽略 null
通常意味着它会吹到其他地方,问题可能更难跟踪。不要让任何方法不必要地接受 null
s,你将不会看到任何 NPE,因为任何地方都没有 null
s。使用类似 Strings#nullToEmpty
的方法尽快摆脱 null
。
I do not prefer 2nd approach since it throws a NPE as unchecked exception. The caller can unexpectedly fail.
NPE 始终未选中。您可以使用 2' 并声明它,但这并没有使它变得更好,因为 @NonNull
参数声明实际上是以最清晰的方式说明发生的事情。它是 @Documented
,这意味着它出现在 javadoc 中。
问题基本上是针对静态实用程序 类,它存在于一个包中以向其他 类 提供某些功能。我举一个常见的例子 stripParenthesis()
Method 1. Explicit Null Check
public static String stripParenthesis(String str) {
if(str == null) {
return str;
}
return str.replaceAll("[()]",""); // remove paarenthesis
}
Method 2. Using Lombok's @NonNull
/* @NonNull will throw NPE */
public static String stripParenthesis(@NonNull String str) {
return str.replaceAll("[()]",""); // remove paarenthesis
}
Method 3. Explicit NPE
public static String stripParenthesis(String str) throws NullPointerException {
if(str == null) {
throw NPE();
}
return str.replaceAll("[()]",""); // remove paarenthesis
}
3种方法全部正确。我不喜欢第二种方法,因为它将 NPE 作为未经检查的异常抛出。调用者可能会意外失败。
这里有通用的约定吗?
方法 1. 显式 Null 检查。
if(str == null) { return str; }
你试图通过什么来实现返回null?通过将所需的空检查和行为委托回调用者来屏蔽错误。也许您认为返回 Optional.empty()
?
方法 2。使用 Lombok 的 @NonNull - 不是一个平等的选择。 这不是具有相关第三方框架问题的 java 标准的一部分。 javax 类似的注释是,但它们不强制进行空检查,它们主要是为静态分析器设计的。尽管如此,Lombok 是可靠的框架。
方法 3. 显式 NPE - 核心实体方法,它始终有效,如果你只是在这三个之间犹豫 - 使用它。
我不会使用方法 1,因为忽略 null
通常意味着它会吹到其他地方,问题可能更难跟踪。不要让任何方法不必要地接受 null
s,你将不会看到任何 NPE,因为任何地方都没有 null
s。使用类似 Strings#nullToEmpty
的方法尽快摆脱 null
。
I do not prefer 2nd approach since it throws a NPE as unchecked exception. The caller can unexpectedly fail.
NPE 始终未选中。您可以使用 2' 并声明它,但这并没有使它变得更好,因为 @NonNull
参数声明实际上是以最清晰的方式说明发生的事情。它是 @Documented
,这意味着它出现在 javadoc 中。