我一直在研究一个代码库,其中以下结构非常常见:
String value = null;
try {
value = pojoClass.getValue().getANumberOfFunctions();
} catch (Exception e) {
//ignore
}
if (value != null) {
//stuff going on
}
只是要指出:如果 pojo 或其任何嵌套对象为 null,则周围的代码只会引发异常。内部没有数据库访问权限,也没有比"get"函数链更复杂的任何其他东西。
据我所知,抛出异常在性能方面比执行几次空检查更昂贵。我可以理解(在一定程度上(这样做,如果有几个对象为了简单起见可能为空(虽然不是为了调试(,但通常我看到的代码包含几行初始化,try/catches可以很容易地进入一个简单的if语句(因为通常"else"意味着什么都不做(。
我错过了什么吗,这是"懒惰编程",这里有超出我理解范围的事情吗?
如果你使用的是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);
});
}
你呈现的只是糟糕的代码,是奇数球解决方案的变体:
同样的问题(这里检查null
(以不同的方式解决。
您应该只坚持使用一个版本。