我的代码中有一种情况,我大约进行了5次链接的get调用,而这些get调用中的任何一个都可能返回空值.我希望不必一定那样,但这就是我使用的服务返回我请求的对象的方式,因此我必须处理它.
最初,我的代码如下所示:
String firstDomain = book.getBookImages().getDomains().getDefaults().getDomain().get(0);
不幸的是,该行容易出现空指针和arraylist超出范围的异常.我知道我将不得不检查空指针,但是我试图决定
A.最有效的代码
和
B.最好看的代码
一种选择是分配大量引用,然后检查是否为空.像这样:
BookImages bImages = book.getBookImages();
Domains domains = null;
Defaults defaults = null;
List domain = null;
String firstDomain = null;
if (bImages != null) {
domains = bImages.getDomains();
if (domains != null) {
defaults = domains.getDefaults();
if (defaults != null) {
domain = defaults.getDomain();
if (domain != null && domain.size() > 0) {
firstDomain = domain.get(0);
}
}
}
}
if (firstDomain == null) {
throw new IncompleteBookException("The book was incompletely attributed.");
}
我认为这非常有效,但令我烦恼的是多少行.它是该方法一部分的长度的两倍以上.
这是我能想到的另一种选择:
if (book.getBookImages() == null || book.getBookImages().getDomains() == null || book.getBookImages().getDomains().getDefaults() == null || book.getBookImages().getDomains().getDefaults().getDomain() == null || book.getBookImages().getDomains().getDefaults().getDomain().size() < 1 || book.getBookImages().getDomains().getDefaults().getDomain().get(0) == null) {
throw new IncompleteBookException("The book was incompletely attributed.");
}
我喜欢这样的事实,即使只有三行,这简直太荒谬了,但是我不确定Java的运行时或编译器是否会优化那些重复的方法调用.
我也欢迎其他更好的解决方案.有谁知道这些选项中的一个或另一个是否会比另一个更好,或者这种微优化是否愚蠢,甚至不考虑它,我应该使用对我来说更好的那个?对于不同的事情,我可能不得不做多次.