用于测试Object是否为null的通用代码?

时间:2015-11-25 16:34:57

标签: java generics nullpointerexception null-check

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

这样的事情:

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

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

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

3 个答案:

答案 0 :(得分:2)

有一些策略可用于测试 null 对象。

您可以使用Guava libraries来检查引用是否 null 或不使用Preconditions API。

检查文档中的 null 检查:http://google.github.io/guava/releases/snapshot/api/docs/com/google/common/base/Preconditions.html#checkNotNull(T)

Guava Github页面上有一个有趣的article,解释了如何避免 null

如果您使用的是Java 8,则可以使用Optional类型来避免始终测试 null 引用。

答案 1 :(得分:2)

评论中有很多内容可以强调可用于避免null检查的技术。

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

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;
  }
}

如果某个Person的{​​{1}}具有属性Address,那么您可以使用zipCode来编写如下代码:

NullCheck

答案 2 :(得分:0)

当您准备对象时,可以将@NotNull注释放到您拥有的参数中,因此当您获取它时,除了null之外还有其他东西(如果您使用的是Java EE 6及更高版本)。对于使用您正在获取的对象执行某些操作,此方法可能非常快...当您将null作为输入传递时,您将获得异常,处理异常需要比简单的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;
}