1

有人可以帮我提供一个通用的优化代码来测试空对象吗?我基本上正在寻找的是一种方法,它可以将任何对象作为输入,也可能是路径并返回一个布尔值,指定目标对象是否为空。

像这样的东西:

public boolean isNull(Object Obj, String Path){
    // ... 
}

路径类似于:A.getB().getC()。. .

所以 A 作为对象传递,isNull方法首先调用getB()检查返回的对象是否不是null然后调用getC()等等。

4

3 回答 3

3

评论中有很多突出显示可用于避免null检查的技术。

如果你真的需要写一些东西来做null一般检查,你可以构建一个小对象图,使用Functions 来遍历被检查的图,如下所示:

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 Personthat has an Addressthat has a 属性zipCode,您可以使用NullCheck编写如下代码:

if (new NullCheck<>(person).with(Person::getAddress).with(Address::getZipCode).isNotNull())
{
  ...
}
于 2015-11-25T17:26:10.780 回答
2

那里有一些可用的策略来测试对象。

您可以使用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类型来避免一直测试引用。

于 2015-11-25T17:08:30.907 回答
0

当您准备对象时,您可以将 @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;
}
于 2015-11-25T17:09:56.943 回答