程序创建一个包含多个选项卡的JDialog面板。其中一个选项卡有几个表。 JTable具有可调节的列宽。此选项卡在不同条件下生成。有时,状态tab
为null
,有时标签存在,但table
为null
。有时用户还没有调整列的大小。
我正在寻找一种方法来保存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时间)。我希望在以后的版本中添加此功能。
答案 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;
}