有人可以帮我提供一个通用的优化代码来测试空对象吗?我基本上正在寻找的是一种方法,它可以将任何对象作为输入,也可能是路径并返回一个布尔值,指定目标对象是否为空。
像这样的东西:
public boolean isNull(Object Obj, String Path){
// ...
}
路径类似于:A.getB().getC()。. .
所以 A 作为对象传递,isNull
方法首先调用getB()
检查返回的对象是否不是null
然后调用getC()
等等。
有人可以帮我提供一个通用的优化代码来测试空对象吗?我基本上正在寻找的是一种方法,它可以将任何对象作为输入,也可能是路径并返回一个布尔值,指定目标对象是否为空。
像这样的东西:
public boolean isNull(Object Obj, String Path){
// ...
}
路径类似于:A.getB().getC()。. .
所以 A 作为对象传递,isNull
方法首先调用getB()
检查返回的对象是否不是null
然后调用getC()
等等。
评论中有很多突出显示可用于避免null
检查的技术。
如果你真的需要写一些东西来做null
一般检查,你可以构建一个小对象图,使用Function
s 来遍历被检查的图,如下所示:
public class NullCheck<T>
{
private T root;
public NullCheck(T root)
{
this.root = root;
}
public <C> NullCheck<C> with(Function<T, C> getter)
{
return root != null ? new NullCheck<>(getter.apply(root)) : new NullCheck<>(null);
}
public boolean isNull()
{
return root == null;
}
public boolean isNotNull()
{
return root != null;
}
}
给定 a Person
that has an Address
that has a 属性zipCode
,您可以使用NullCheck
编写如下代码:
if (new NullCheck<>(person).with(Person::getAddress).with(Address::getZipCode).isNotNull())
{
...
}
那里有一些可用的策略来测试空对象。
您可以使用Guava 库使用Preconditions API检查引用是否为空。
检查非空检查的文档:http: //google.github.io/guava/releases/snapshot/api/docs/com/google/common/base/Preconditions.html#checkNotNull(T)
Guava Github 页面上有一篇有趣的文章,解释了如何避免null。
如果您使用的是 Java 8,则可以使用Optional类型来避免一直测试空引用。
当您准备对象时,您可以将 @NotNull 注释添加到您拥有的参数中,因此当您将其取出时,您将拥有除 null 之外的其他内容(如果您使用的是 Java EE 6 及更高版本)。这种方法可以非常快地处理您正在获取的对象......当您将 null 作为输入传递时,您将得到一个异常,处理异常需要更多的资源和时间,而不仅仅是简单的空检查。
如果你想编写自己的方法而不使用上面提到的东西,你可以使用这样的东西(如果不需要异常,你可以省略它):
private static final String NE_MESSAGE = "Object is null...";
private static final String NULL_LOG = "Value is null, param name: ";
public static boolean isNull(Strin name, Object... object) {
for(Object o : object) {
if ( o == null) {
NullException ne = new NullException(NULL_MESSAGE);
LOGGER.error(NULL_LOG + name);
throw ne;
}
}
return Boolean.FALSE;
}