Java 简单的“isNull”/“isNotNull”函数有什么用?

Neu*_*nte 4 java null function

问这个问题我觉得很傻,但我已经在两个独立的公司代码库上看到了这段代码,我开始认为有一些我不知道的古老 Java 知识。

所以,我们得到了这样的代码:

/* Lot of corporate stuff */
if (ClassicUtilsClass.isNotNull(variable)) {
    /* Variable handling shenanigans. */
}
Run Code Online (Sandbox Code Playgroud)

转到我们的 ClassicUtilsClass 揭示了该函数的实现:

/* Lot of useful static functions*/
public static isNotNull(Object o) {
    return o!=null;
}
public static isNull(Object o) {
    return o==null;
}
Run Code Online (Sandbox Code Playgroud)

我读了它,挠挠头,环顾互联网,询问同事和朋友,然后嘲笑该功能的无用。然后我换了工作,一位同事向我展示了或多或少相同的代码。

在同一个代码库中,我们有经典的“isNullOrEmpty”,它执行标准的“return object==null || object.size() == 0;”,所以我可以理解有一个函数来包装空比较......加上别的东西,但我没有看到为空检查创建一个全新的函数的意义。

我在这里失去了什么?

khe*_*ood 6

Objects实用程序类中有类似的函数,称为nonNullisNull。提供它们的原因是用作谓词,例如

...stream().filter(Objects::nonNull)...
Run Code Online (Sandbox Code Playgroud)

我看不到任何使用的理由

if (SomeClass.isNotNull(x))
Run Code Online (Sandbox Code Playgroud)

而不是更短、更清晰

if (x!=null)
Run Code Online (Sandbox Code Playgroud)


Ral*_*och 3

我能想到的将运算符实现为方法的原因只有几个。

第一个原因是“分析”该操作在应用程序中使用的次数。分析工具会计算方法所花费的时间以及调用方法的次数,但它们不会跟踪操作符的使用情况。

将运算符实现为函数的第二个原因是在函数式编程结构中使用它们。运算符不能使用反射传递,但方法可以,因此可以创建使用反射的函数操作(映射、归约等),在这些情况下,运算符需要实现为要使用的方法。

将 not null 运算符实现为方法的第三个可能的原因是简化其他一些编程语言到 java 的自动翻译。在 java 中,基本类型不能为 null,因此直接使用 == 运算符检查它们是否为 null 会导致编译器错误。Java 会将原语自动装箱为对象,以便它们可以用作接受 Object 作为参数类型的方法的参数。在这种情况下,代码转换器可以将空检查转换为方法调用,而无需跟踪变量类型。