我一直致力于一个代码库,其中以下结构很常见:
String value = null;
try {
value = pojoClass.getValue().getANumberOfFunctions();
} catch (Exception e) {
//ignore
}
if (value != null) {
//stuff going on
}
要指出:如果pojo或其任何嵌套对象为null,则包围的代码只会抛出异常。内部没有数据库访问,或者比“get”函数链更复杂。
据我所知,抛出异常在性能方面比进行多次空检查更昂贵。我可以理解(直到某一点)这样做,如果为了简单起见有几个对象可能为null(虽然不是出于调试的缘故),但通常我看到的代码包含几行初始化,试试/捕获可以很容易地进入一个简单的if语句(通常“else”意味着什么都不做)。
我错过了什么,这是“懒惰的编程”,在我的理解之上有什么东西在这里发生了吗?
答案 0 :(得分:2)
如果您使用的是Java 8,我建议您使用Optional类。它允许您根据对象是否存在(非空)或不以一行方式有条件地执行某些操作。例如:
static class A {
private B b;
public A(B b) {
this.b = b;
}
public B getB() {return b;}
}
static class B {
private String s;
public B(String s) {
this.s = s;
}
public String getS() {
return s;
}
}
public static void main(String[] args) {
A a1 = new A(new B("a1"));
A a2 = new A(null);
Optional.ofNullable(a1).map(A::getB).map(B::getS).ifPresent(s->{
System.out.println(s);
});
Optional.ofNullable(a2).map(A::getB).map(B::getS).ifPresent(s->{
//this won't be executed
System.out.println(s);
});
}
答案 1 :(得分:1)
你所呈现的只是错误的代码,奇数球解决方案的变体:
同样的问题(这里检查null
)以不同的方式解决。
你应该只使用一个版本。