我需要实现一个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;
}
}
这样做有好处吗?
答案 0 :(得分:2)
嗯......你已经犯了错误:
我需要实现一个isNull()实用程序方法,检查任何给定的对象是null还是空。
这使名称isNull
可怕地误导。您应该更改名称以反映其意图,例如isNullOrEmpty
或isEmpty
(a-la Apache Commons Framework)。
现在,实际实施。这取决于你希望这种方法的尊重。
((Collection)object).isEmpty()
。String
,那么您应该使用更简单的检查 - "".equals(object)
。如果不 String
,null
或String
并且不为空,则会返回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
检查链),然后然后你可以用它做一些有意义的事情。