在将可能为null的整数与常量进行比较时,是否可以避免空检查?

时间:2016-10-20 14:55:07

标签: java

我在Java 7中使用Struts2框架,结合Dojo 1.8或1.9(在极少数情况下为1.3)作为前端库,具体取决于页面。我有几个带有Dojo Selects或FilteringSelects的搜索页面返回一个Integer值:0和更高是合法值,-1和null是在Select中没有选择任何内容时返回的值,具体取决于页面是刚刚加载还是是否已被Javascript重置。

搜索时,我必须检查Integer中是否存在合法值,如果没有将其设置为null,那么我的搜索服务方法就知道它应该忽略它。这意味着如果它为-1则将其设置为null,或者如果它为null或者> = 0则将其保留为原样。

我目前通过方法开头的以下检查来完成此操作:

// as a class constant
public static final int DOJO_NO_SELECTION = -1;

// in my search action
if (view.getNullableInteger() != null && view.getNullableInteger() == DOJO_NO_SELECTION) {
    view.getNullableInteger(null);
}

我觉得前面额外的零检查是丑陋的,我想避免它。我试过这样做:

// as a class constant
public static final Integer DOJO_NO_SELECTION = new Integer(-1);

if (view.getNullableInteger().equals(DOJO_NO_SELECTION)) {
    view.getNullableInteger(null);
}

我试过翻过2:

if (DOJO_NO_SELECTION.equals(view.getNullableInteger())) {
    view.getNullableInteger(null);
}

但是当view.getNullableInteger()为空时,这两个都会给我一个NullPointerException。

是否可以编写此代码以避免nullcheck,但它仍适用于null?

2 个答案:

答案 0 :(得分:5)

使用Objects.equals

if (Objects.equals(view.getNullableInteger(), DOJO_NO_SELECTION)) {
    view.getNullableInteger(null);
}
  

如果参数彼此相等则返回true,否则返回false。因此,如果两个参数都为null,则返回true,如果只有一个参数为null,则返回,返回false 。否则,通过使用第一个参数的equals方法确定相等性。

答案 1 :(得分:3)

使用Yoda condition,并将常量int显式地加到Integer

if (Integer.valueOf(DOJO_NO_SELECTION).equals(view.getNullableInteger()) {
  // ...
}

请注意Integer.valueOf(-1)guaranteed to be cached,因此每次调用都不会创建新对象。