静态实用程序方法 - 显式NULL检查vs @NonNull vs显式抛出

时间:2015-08-12 08:16:10

标签: java exception lombok

问题基本上是静态实用程序类,它存在于一个包中,为其他类提供某些功能。我将采用一个常见的例子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作为未经检查的异常抛出。呼叫者可能意外失败。

这里有一般惯例吗?

2 个答案:

答案 0 :(得分:3)

我不会使用方法1,因为忽略null通常意味着它会在其他地方爆炸,而问题可能会更难跟踪。不要让任何方法不必要地接受null,你就不会看到任何NPE,因为任何地方都没有null。使用像Strings#nullToEmpty这样的方法尽快摆脱null

  

我不喜欢第二种方法,因为它会将NPE作为未经检查的异常抛出。来电者可能意外失败。

NPE始终未经检查。您可以使用2'并声明它,但这并不能使它真正更好,因为@NonNull参数声明实际上是以最清晰的方式说明发生了什么。它是@Documented,这意味着它出现在javadoc中。

答案 1 :(得分:2)

方法1.显式空检查。

  

if(str == null){           返回str;       }

你尝试返回null是什么?通过将所需的空检查和行为委托给调用者来实现此屏蔽错误。也许你假定返回类似Optional.empty()的东西?

方法2.使用Lombok的@NonNull - 不是一个平等的选择。 这不是具有相关第三方框架问题的java标准的一部分。 javax类似的注释是,但它们不会强制进行空检查,它们主要用于静态分析器。尽管如此,龙目岛仍然是可靠的框架。

方法3.明确的NPE - 核心固体方法,它始终有效,如果您只在三者之间犹豫 - 使用它。