我在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?
答案 0 :(得分:5)
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,因此每次调用都不会创建新对象。