Null Utility方法是否更好实现

时间:2017-11-10 16:50:31

标签: java

我需要实现一个isNull()实用程序方法,检查任何给定对象是null还是空。
我提出了一个解决方案:请参阅下面的代码。

我知道在最新版本的Java中,instanceof的开销已经减少,并且是微优化。这是我检查isNull的实现。

public static boolean isNull(Object object) {
    if (object instanceof String) {
        return ((String) object).length() == 0;
    } else if (object instanceof Object[]) {
        return ((Object[]) object).length == 0;
    } else if (object instanceof Collection) {
        return ((Collection) object).isEmpty();
    } else if (object instanceof Map) {
        return ((Map) object).isEmpty();
    } else {
        return object == null;
    }
}

这样做有好处吗?

2 个答案:

答案 0 :(得分:2)

嗯......你已经犯了错误:

  

我需要实现一个isNull()实用程序方法,检查任何给定的对象是null还是空。

这使名称isNull 可怕地误导。您应该更改名称以反映其意图,例如isNullOrEmptyisEmpty(a-la Apache Commons Framework)。

现在,实际实施。这取决于你希望这种方法的尊重。

  • 如果你想尊重空集合,这是合理的 - 并且可以通过强制转换为((Collection)object).isEmpty()
  • 如果你想尊重空阵列,我个人不会推荐这个,因为无论有人告诉你什么,空阵列完全没用
  • 如果您也想尊重String,那么您应该使用更简单的检查 - "".equals(object)。如果 StringnullString并且不为空,则会返回false。

这些事情的实际实施,我留给读者练习。

答案 1 :(得分:1)

  

想知道其他任何更好的方法。

更好的方法是直接使用这些类的API。

e.g。而不是:

isNull(someString)
isNull(someCollection)

使用

someString == null || someString.isEmpty()
someCollection == null || someCollection.isEmpty()

这更详细,但有几个优点:

  • 如果你默默地将空虚和无效视为同一件事,你可能会忽略代码中的错误。只有在错误的情况下null情况才是真的:你从其他地方获得了这个值,你期望得到一个非空值,但是你有一个编程错误。

    相反,通过显式测试null,您将记录您对提供该null值的代码的期望。或者,您可以省略它,记录您希望该值为非null。

  • 您的方法只能正确判断"空虚"字符串,集合,引用类型数组或映射;如果你在其他东西上使用它,那里有一个定义的空虚概念,该方法只会告诉你它是否为空。通过打电话给班级' API明确地说,您可以正确地确定空虚。

    这个论点的另一面是没有"空虚"对于某些类型,例如Integer。考虑这些是否为空是没有意义的,所以你不应该将它传递给这种方法。

    将参数限制为仅仅是字符串,引用类型数组,集合或映射的另一种方法是为这些类型提供重载,例如: isNullOrEmpty(String)isNullOrEmpty(Object[])等,并且不会过载Object

但是,如果您只有Object参考,即您不知道如何确定空虚,该怎么办?好吧,Object无论如何都不是很有用。所以你有一个空的Object空引用。太棒了......现在怎么样?

您必须将其转换为其他内容,除非您只是想在其上调用toString(),或检查它是否为null。所以,在方法之外进行转换(例如使用instanceof检查链),然后然后你可以用它做一些有意义的事情。