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){}ブロックについて何か考えたことはありますか?洗練されていないように感じるかもしれませんが、前の呼び出しが を返したためにいずれかのメソッド呼び出しが失敗した場合、コードを停止し、nullnull の場合はデフォルト値を与える機会を与えます。

別のオプションは次のようなものです。

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 ステートメントが次々に実行される場合、1 つの null によって次のすべてのステートメントが実行されなくなりますが、その値は毎回チェックされます。

これらのステートメントを生成する限り、私にはよくわかりません。Objectそれは、以前のメソッド呼び出しによって返されたメソッドからどのような新しいメソッドが利用可能になるかをどれだけ前もって予測できるかに大きく依存します。コードの自動生成を目指している場合は、私の最初の提案を使用することをお勧めします。try-catch

于 2013-07-31T13:46:17.853 に答える
0

これは、誰もコードを読まない場合にのみ行ってください。生成されたコード、特に求めているものは避けるようにしてください。

getB()メソッドはさらに 4 回呼び出されます。

手動で null をチェックすることで、コーディングをより速く学び、自動コード修正に頼らないバグを減らすことができます;)

于 2013-07-31T10:13:25.973 に答える