在Java中对复合对象进行高效的空检查

时间:2016-08-05 20:10:18

标签: java if-statement null

程序创建一个包含多个选项卡的JDialog面板。其中一个选项卡有几个表。 JTable具有可调节的列宽。此选项卡在不同条件下生成。有时,状态tabnull,有时标签存在,但tablenull。有时用户还没有调整列的大小。

我正在寻找一种方法来保存columnWidth值,如果用户调整了列的大小。在这种情况下检查null似乎很笨重:

jpanel.tab.table.width

我能找到的最佳方法是:

if( jpanel!=null && 
    jpanel.jtab!=null &&
    jpanel.jtab.jtable!=null && ...

有没有更好的方法进行空检查?

我看到了这个问题:
is there a Java equivalent to null coalescing operator (??) in C#?

它没有列出解决方案,而且很老(Java 6-7时间)。我希望在以后的版本中添加此功能。

3 个答案:

答案 0 :(得分:0)

没有办法完全按照自己的意愿行事。 但是,您可以将所有内容都放入try语句中:

try { 
    myItem = bundle.category.subcategory.item;
} 
catch(NullpointerException ignored) {}

请注意,这看起来非常黑,而且编码练习相当糟糕。就清晰度而言,您当前的解决方案可能是最佳方法。

编辑:我尝试发布另一个Anwser,但按钮显示为灰色,所以我会把它放在这里:

  

当你应该使用for循环

时,感觉好像多次重复相同的代码

您确实可以使用for循环,但这将调用反射和许多样板代码。想象一下这样的事情:

static boolean checkDeepNull(Object root, String... attributes) throws NoSuchFieldException, IllegalAccessException {
    Object currentAttribute = root;
    for(int attr = 0; currentAttribute != null && attr < attributes.length; attr++){
        Field nextField = currentAttribute.getClass().getField(attributes[attr]);
        Object nextAttribute = nextField.get(current);
        if(nextAttribute == null) return false;
        currentAttribute = nextAttribute;
    }
    return true;
}

如何使用它:if(checkDeepNull(bundle, "category", "subcategory", "item"))

答案 1 :(得分:0)

你可以有一个确定可空性的界面:

left

然后让父母调用任何像这样的孩子:

public interface Nullability {
    public boolean hasNulls();
}

无论如何,如果你必须对所有内容进行null检查,那么如果不提供迭代方法,那么你将会做很多样板代码。这就是你应该关注的内容。

在个人层面上,我不同意暴露这样的领域。这是一种非常简单的方法,可以导致更多的头痛和设计错误。

答案 2 :(得分:0)

简短的回答是

你可以重新设计捆绑,以便它总是完全构建?即,如果bundle != null,则类别,子类别和项目始终存在?这也有助于解决并发问题。基本上,如果空值给您带来问题,请尽可能不允许这些字段为空。

另一个选项是Null Object Pattern。基本上,你有一个&#34;默认&#34; Bundle的实现始终返回getCategory(),它始终返回getSubcategory()的值,但最终对getItem()的调用返回null或某些东西以指示&#34;没有&#34;。这是一个很好的模式,但需要一些工作。

我毫不犹豫地提出建议,但是很少有任何项目是空的,在某些时候它可能更快更清楚地捕获NPE,但这种风格应该真的避免。这是一个明确的代码气味,你的设计很差。如果可能的话,尽量避免使用它。

try {
  return foo.bar.bap.zaz.blah.blah;
}
catch (NullPointerException ignored) {
  return null;
}