2

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

2 回答 2

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

于 2013-07-31T13:46:17.853 回答
0

仅当没有人会阅读您的代码时才这样做。尽量避免生成代码,尤其是您要求的代码。

getB()方法被额外调用 4 次,依此类推。

通过手动检查null,您将更快地学习编码并减少不依赖自动代码更正的错误;)

于 2013-07-31T10:13:25.973 回答