eclipse autogenerates!= null递归调用

时间:2013-07-31 10:08:00

标签: java eclipse templates eclipse-jdt

给出一个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(); 
   }        

2 个答案:

答案 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,您将更快地学习编码并减少错误,而不依赖于自动代码校正;)