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



这个问题基本上是针对静态实用程序类的,这些类存在于包中,为其他类提供某些功能。我举一个常见的例子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通常意味着它会在其他地方爆炸,而不是在那里问题可能变得更难跟踪。让任何方法都不接受不必要的null,你就不会看到任何npe,因为任何地方都没有null。使用像Strings#nullToEmpty这样的方法来尽快摆脱null

我不喜欢第二种方法,因为它抛出一个未检查的NPE异常。调用者可能意外失败。

NPE总是未检查的。您可以使用2'并声明它,但这并不能使它变得更好,因为@NonNull参数声明实际上是以最清晰的方式陈述发生的事情。它是@Documented,这意味着它出现在javadoc中。

方法1。显式Null检查

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

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

方法2。使用Lombok的@NonNull -并不是一个平等的选择。这不是java标准中存在相关第三方框架问题的一部分。javax类似的注释是,但它们不强制null检查,它们主要是为静态分析器设计的。尽管如此,Lombok是一个可靠的框架。

方法3。显式NPE -核心固体方法,它总是有效的,如果你只在这三者之间犹豫-使用它

最新更新