【发布时间】:2023-03-20 04:25:01
【问题描述】:
我有一个应用程序,它使用的代码生成各种类型的对象和数据结构,将它们作为 Object 实例返回,并且想要一种确定这些对象是否为“空”(或 null)的通用方法。
(这不是设计问题,也不是是否应该使用这种方法的问题,而是针对现有需求优化解决方案的问题。)
所以,这是一个简单的步骤:
public static boolean isEmpty(Object content)
{
if (content == null)
{
return true;
}
else if (content instanceof CharSequence)
{
return (((CharSequence)content).length() == 0);
}
else if (content instanceof Collection<?>)
{
return ((Collection<?>)content).isEmpty();
}
else if (content instanceof Object[])
{
return (((Object[])content).length == 0);
}
else // Use reflection (an exaggeration, for demo purposes)
{
try
{
Method isEmpty = content.getClass().
getDeclaredMethod("isEmpty", (Class<?>[])null);
if (isEmpty != null)
{
Object result = isEmpty.invoke(content, (Object[])null);
if (result instanceof Boolean)
{
return (Boolean)result;
}
}
}
catch (Exception e)
{
}
}
return false;
}
在性能或覆盖范围方面有任何潜在改进的想法吗?
比如反射也可以用来判断对象是否有length()或size()方法,调用它看结果是否为0。(实际上反射可能太多了,但我是为了完整起见,将其包括在此处。)
是否有一个非常常用的顶级类,它具有 length() 或 size() 方法,而不是 isEmpty() 方法,以包含在上述情况中,类似于具有 isEmpty() 的 Collection?
【问题讨论】:
-
乍一看,单独使用这种方法似乎是一个糟糕的设计决策。这将如何使用?
-
它用于检查对象的“空性”,由产生多种不同类型数据的不可更改方法返回。
-
为什么?如果您正在调用此方法,您可能应该已经知道要传递给它的对象,只需在对象本身上调用
isEmpty就可以省去麻烦。 -
这不是将对象传递给方法,而是从中获取对象。返回类型未知,它只是一个对象!
-
这真是令人沮丧。根本没有办法避免这种情况吗?就个人而言,我宁愿重写我的大部分项目也不愿接受这样的怪物。
标签: java data-structures collections is-empty