给出一个java代码,例如:
Something v = a.getB().getC().getD().getE();
Eclipse(模板或外部插件)中是否有一种方法可以生成安全链调用:
if(a!=null &&
a.getB()!=null &&
a.getB().getC()!=null &&
a.getB().getC().getD()!=null &&
a.getB().getC().getD().getE()!=null){
Something v = a.getB().getC().getD().getE();
}
答案 0 :(得分:1)
您是否考虑过try{} catch(NullPointerException e){}
块?它可能感觉不那么优雅,但如果任何方法调用失败,它会停止你的代码,因为前一个方法调用返回null
,如果它为null,它将给你机会提供默认值。
另一种选择是这样的:
Something v = /*Default Value*/ // Will be overwritten if subsequent methods succeed.
Object temp = a.getB(); // Use whatever Object type getB() returns.
if(temp != null){
temp = temp.getC();
/* If getC() returns a different type of object,
* either use a different variable or make the temp variable even broader
* (such as the generic Object type) */
if(temp != null){
temp = temp.getD();
if(temp != null){
temp = temp.getE();
if(temp != null)
v = temp;
/* If all previous calls returned something substantial,
* v will be something useful */
}//if(getE() != null)
}//if(getD() != null)
}//if(getC() != null)
}//if(getB() != null)
如果需要,可以通过不嵌套if语句,使用稍微低一点的CPU效率,但更容易阅读。如果所有的if语句都是在彼此之后执行的,那么单个null将阻止所有下一个语句执行,尽管每次都会检查它的值。
就产生这些陈述而言,我并不确定。这实际上取决于您可以提前多久预测从以前的方法调用返回的Object
中可用的新方法。如果您的目标是自动生成代码,那么我的第一个建议可能会更好:try-catch
答案 1 :(得分:0)
只有在没有人会阅读您的代码时才这样做。尽量避免生成代码,特别是你要求的代码。
getB()
方法被称为额外4次,等等。
通过手动检查null,您将更快地学习编码并减少错误,而不依赖于自动代码校正;)