表示,“无论是不是null,不等于” Java中的实用方法(A utility method rep

2019-10-24 09:50发布

String str = "abc";

像下面这个字符串变量比较。

if(str.equals("abc")) {}

如果strnull ,就会造成java.lang.NullPointerException抛出明显。

为了避免这种情况,一个额外的空检查可予以强制执行。 如,

if(str != null && str.equals("abc")) {}

我觉得它难看。 更好的可被重写如下。

if("abc".equals(str)) {}

这绝不会抛出一个java.lang.NullPointerException尽管strnull 。 此外,对象等于null是不正确的。


最后一种情况下然而,不​​能使用,当条件表达式被反转像这样,

if(!"abc".equals(str)) {
    System.out.println(str.length());
}

这将导致java.lang.NullPointerException里面if块,如果strnull

可以这样莫名其妙地被避免,不重写条件语句像下面这样?

if(str != null && !"abc".equals(str)) {}

这是丑陋,无法读取。


虽然示例使用一个String对象,它可能是一个更复杂的对象。

Answer 1:

另一种可能是使用Java 8可选封装

Optional<Customer> optional = findCustomer();

if (optional.isPresent()) {
Customer customer = maybeCustomer.get();
    ... use customer ...
}
else {
    ... deal with absence case ...
}

来源: https://dzone.com/articles/java-8-optional-how-use-it



Answer 2:

你必须检查null在某些时候,如果你想使用str 。 我们根本没有办法解决它。 你可以用此支票存入一个额外的效用函数或类似这样的东西,但最终你不会得到周围的额外的检查。

如果你正在使用的附加库负荷的朋友,你可以使用org.apache.commons.lang.StringUtils#length(java.lang.String) 。 这不只是你想要什么,也许你有像存在于你的应用程序库反正。 apache的一个仅仅是一个例子。 还有其他人肯定围绕着做类似的事情。

如果你想删除的null支票一起,也许更好的问题是:为什么strnull ,这是可能的,以防止它被null的不接受从一开始这个值。



Answer 3:

另一种可能的方式,以避免空值是使用assert :看看这个答案在另一个类似的问题:

如何检查看到,一组变量是不是在继续前空



Answer 4:

长话短说:是根本不存在的库法这样做,我知道的。 这if(str != null && !"abc".equals(str)) {}实际上要求要比较两个对象都没有null ,而不是彼此相等。

执行此任务的静态实用方法足以应付。

/**
 * Returns {@code true} if and only if both the arguments (objects) are
 * <b>not</b> {@code null} and are not equal to each other and {@code false}
 * otherwise.
 *
 * @param a an object.
 * @param b an object to be compared with {@code a} for equality.
 * @return {@code true} if both the arguments (objects) are <b>not</b> {@code null}
 * and not equal to each other.
 */
public static boolean notEquals(Object a, Object b) {
    return (a == b || a == null || b == null) ? false : !a.equals(b);
}


文章来源: A utility method representing, “Both not null and not equal” in Java