我对这个问题感到非常愚蠢,但我已经在两个独立的公司代码库中看到了这个代码,我开始认为有一些我不知道的古老java知识。
所以,我们得到了这样的代码:
/* Lot of corporate stuff */
if (ClassicUtilsClass.isNotNull(variable)) {
/* Variable handling shenanigans. */
}
转到我们的ClassicUtilsClass,揭示了该函数的实现:
/* Lot of useful static functions*/
public static isNotNull(Object o) {
return o!=null;
}
public static isNull(Object o) {
return o==null;
}
我看了它,挠了挠头,环顾网络,问同事和朋友,然后嘲笑功能的无用性。然后我换了工作,一位同事给我看了或多或少相同的代码。
在相同的代码库中,我们有经典的“isNullOrEmpty”,它使用标准的“return object == null || object.size()== 0;”,所以我可以理解有一个函数来包装null比较。 ..加上其他东西,但我没有看到为null检查创建一个全新的函数。
我在这里失去了什么?
答案 0 :(得分:3)
Objects
实用程序类中有类似的函数,称为nonNull
和isNull
。它们被提供的原因是用作谓词,例如
...stream().filter(Objects::nonNull)...
我看不出有任何理由使用
if (SomeClass.isNotNull(x))
而不是更短,更清晰
if (x!=null)
答案 1 :(得分:3)
实现运算符的原因只有几个我能想到的方法。
第一个原因是“分析”应用程序中使用操作的次数。分析工具会计算方法所花费的时间以及调用方法的次数,但它们不会跟踪操作员的使用情况。
将运算符实现为函数的第二个原因是在函数式编程结构中使用它们。操作符不能使用反射传递,但方法可以,因此可以创建使用反射的功能操作(map,reduce等),在这些情况下,操作符需要实现为要使用的方法。
将非null运算符实现为方法的第三个可能原因是简化其他一些编程语言到java的自动转换。在java原语类型中不能为null,因此使用==运算符直接检查它们是否为null将导致编译器错误。 Java将autobox基元自动放入对象中,因此它们可以用作接受Object作为其参数类型的方法的参数。在这种情况下,代码转换器可以将空检查转换为方法调用,而无需跟踪变量类型。
答案 2 :(得分:0)
也许原因可能是在某些测试中,模拟ClassicUtilsClass.isNotNull和ClassicUtilsClass.isNull方法返回true或false非常有用。
无论如何,我无法理解这一点。不同的是Apache Commons的StringUtils.isEmpty,如果字符串为null或等于"则返回true;"