2010-11-24 12 views
1

メソッドの最後の "return"とjavaのメソッドの最後の前に置かれた "return"の違い。メソッドの最後の "return"とjavaのメソッドの最後の前に置かれた "return"の違いは?

次のコードのようにメソッドの最後の前に "return"ステートメントを置くと、どうなりますか?それはメソッドの最後に、通常の「リターン」よりもシステムのバードンを増加させるかどうか

boolean sample() 
{ 
    boolean b=false; 
    int a=0; 

    if(a==0) 
    return(true);   //This return what happens 
    return(false); 
} 

答えて

4

いいえ、全く違いはありません。

最終的には常に1つのreturn文しか持たないように構造化したい人もいます。個人的には、コードが結果を知るとすぐに返される傾向があります。 (特に「入力がnullで出力がnullの場合」)場合がありますが、場合によっては結果がと表示されますが、他の入力にはかなりの処理があります。

+0

これは、必要なネスティングのレベルを低下させる傾向があります。私は同意する、それは通常より読みやすい。 –

+0

これは、コードの構造を難読化する犠牲を払って入れ子のレベルを減らします。そうではありませんが、コードを読みやすくすることはできませんが、読みやすく表示されるようになりますが、それはうそです。 – JeremyP

+1

@JeremyP:私はそれがかなり逆であると言いたいと思います。コードを通るパスをはっきりと見せます。なぜなら、あなたが戻ってくるのを見て、何が起こったのか知っているからです。ちょうど関連する何かをやり直す場合に備えて、残りのメソッド*を読む必要はありません。私は両方のスタイルでコードを扱ってきました。そして、 "ワン・リターン・ポイント"のマントラは可読性のためにひどい*です。 –

0

すべての返品は似ています。あなたの例では、複数の返品は必要ありません。

return a == 0; 

問題があるかどうかを確認するまで、パフォーマンスの問題は心配しないでください。フォーラムで心配しているパフォーマンスの問題のほとんどは、実際のところ大きな違いはありません。

3

メソッドの最後に "return"とjavaでメソッドが終了する前に置かれた "return"の違いは?

意味上の違いはありません。

唯一考えているのは、無条件の return文では到達不能な文が返される可能性があるということです。例えば

int a = 0; 
    return a == 0; 
    int b = 1;  // compilation error here ... statement is unreachable 
    return b == 1; 

それは方法の終了時に通常の「リターン」よりもシステムのバードンを増加させるかどうか。

いいえ、そうではありません。生成されたバイトコード(およびネイティブコード)は、必要に応じて複数の戻り命令を持つことができます。単一のステートメントとして

if (a == 0) return (true); 
    return (false); 

return a == 0; 

をし、Javaでreturn文を括弧を使用する必要はありません

しかし、明快/読みやすさのためには、これらの二つの文を記述することをお勧めします。

0

複数の返品は、あなたのメソッドの複数の存在するポイントであり、システムに「余分な負担」をかけることはなく、「通常の」返品と同じです。

このメソッドは、最初のリターンに達したときに終了し、returnステートメントを実行した後に他のコードは実行されません。コントロールは呼び出し元のメソッドに戻ります

0

Jon Skeetが正しいと言われたことは、関数が正しい結果を得たならば、関数が不必要なチェックやループなどを待つのではなく、すぐに結果を返させるようにします。関数はより速い結果とより良い読みやすさを得る

0

メソッド内に複数のリターンを持つことは本質的に間違っていることではありません。ほとんどの再帰関数はmulipleリターンを持つことになります。

public String flattenTree(Node currentNode, String stringSoFar) { 
    // do our work on this node 
    stringSoFar = stringSoFar + currentNode.getName(); 

    // end condition- if we've got no children left we're done so leave now 
    if (currentNode.countChildren() ==0) { 
     return stringSoFar; 
    } 

    // recursive condition- keep digging through the children of our current node 
    for (int i=0; i<currentNode.countChildren(); i++) { 
     stringSoFar = stringSoFar + flattenTree(currentNode.getChild(i)); 
    } 
    return stringSoFar; 
} 

がきれいに見え、あなたがはっきりあなたの終了条件をマークすることができます...私はかなりあなたが再帰を行うことを教えられたように見えるように構築されていますという理由だけで、このアプローチのようにバック学校で...

単一のリターンにそれを圧縮すると間違って何もない:間違いなくより良い

public String flattenTree(Node currentNode, String stringSoFar) { 
    // do our work on this node 
    stringSoFar = stringSoFar + currentNode.getName(); 

    // loop through children if neccessary 
    for (int i=0; i<currentNode.countChildren(); i++) { 
     stringSoFar = stringSoFar + flattenTree(currentNode.getChild(i)); 
    } 

    return stringSoFar; 
} 

より少ないコード、間違いなく、あまり目立たない、あなたのエンドケースはどこにあるのか...

パフォーマンス面では、パフォーマンスが他のものよりも優れているとは言えませんが、性能が重視されるコードで作業しない限り、少なくともこの仮説的な例では、読みやすくするために複数のリターンを選択することをお勧めします。

関連する問題