2012-03-07 8 views
4

以下のjavaスニペットのような状況では、elseブロックの後ろに置くのと比べてfalseを返すのは、より高速か、より良い方法でしょうか?Java:ここに他のものをもっと速く含んでいますか?またはより良い練習ですか?

public boolean test(boolean var){ 
    if (var == true){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

に比べ

public boolean test(boolean var){ 
    if (var == true){ 
     return true; 
    } 
    return false; 
} 

は明らかにこれは1行に短縮することができ、非常に単純な例ですが、私の質問は他を使用することがより効率的にJVMの最適化があるかどうかであります両方のスニペットが論理的に同等であるため、より良い方法です。これまでは、コードが少ししかないので、最初のスニペットを使用していました。

+0

それよりもきれいなものを選んでください。 – Mysticial

+1

@神秘的なもの:あなたの方がよりかわいい**を選んでください**。修正しました。 :) – haylem

答えて

13

Iコンパイル両方の例と結果のバイトコードは同じです:

public boolean test(boolean var); 
    0 iload_1 [var] 
    1 ifeq 6 
    4 iconst_1 
    5 ireturn 
    6 iconst_0 
    7 ireturn 
     Line numbers: 
     [pc: 0, line: 5] 
     [pc: 4, line: 6] 
     [pc: 6, line: 8] 
     Local variable table: 
     [pc: 0, pc: 8] local: this index: 0 type: scratch.Else1 
     [pc: 0, pc: 8] local: var index: 1 type: boolean 

    public boolean test(boolean var); 
    0 iload_1 [var] 
    1 ifeq 6 
    4 iconst_1 
    5 ireturn 
    6 iconst_0 
    7 ireturn 
     Line numbers: 
     [pc: 0, line: 5] 
     [pc: 4, line: 6] 
     [pc: 6, line: 8] 
     Local variable table: 
     [pc: 0, pc: 8] local: this index: 0 type: scratch.Else2 
     [pc: 0, pc: 8] local: var index: 1 type: boolean 

としての1のためにあなたが使用する必要がありますか?このような人為的な例では、答えは音である。動作と一致し、最良のコードはこれです:「{}リターンリターン場合は」「であれば{リターン}他{リターン}」対の選択肢を考えると

public boolean test(boolean var){ 
    return var; 
} 

私が好むので、私の答えは、後者が通常でありますインデントが少なくなります。しかし、私はそれが本当にどのくらいのコードが各支店にあるかにかかっていると思います。その他のコードは後者を指し、コードが前者を指しているとします。あなたが与えた正確なコードスニペットの面では

+1

+1は正確です! – smessing

+2

+1実証的な答え。今あなたはどちらを使うべきですか?あなたにとってより意味のあるもの、またはコードを読む他の人に。 – paislee

+0

@paislee、 "should"という質問に答えるために編集 –

-1

elseが必要でないため、最初の方が優れています。それがJavaプログラムであろうと自動車であろうと他のものであろうと、デザインに不要な部分を含めることは決してありません。

UPDATE:

必要は常識では功利主義を意味するものではありません。 superfluityが深いまたは美学の防衛のためのものであるならば、例えば、それは不必要ではありません。投稿された質問の例を理解することは単純ですが、以下は不要なelseが追加のreturn文が必要であるという点でデザインを複雑にする例です。

public static int add(int a, int b){ 
    if(a > 0){ 
     int c = a+b; 
     return c; 
    } else if(a<= 0){ 
     int c = a-(-b); 
     return c; 
    } 
} 

BTY:例では、不条理に引数を低減しつつ、不要な部分の点を示します。

+0

私は、それが必要ではなく功利主義的ではなく、(議論が可能で主観的な)理由で、私たちが追加したり、「強化する」ものがたくさんあると言います。 – haylem

2

これは非常に個人的なスタイルの問題であり、さまざまな人々があなたに異なる意見を与えます。正解は誰もいません。パフォーマンスに関しては問題ではありません。コンパイラはそれらを正確に同じものに最適化します(私は実験的にこれをテストしました)。

個人的には、私は余分なelseがきれいだと思います。しかし、これは職場での私の機能プログラミングの背景かもしれません。

-1

複数の出口点を削除することが可能であれば、より良い点があります。つまり、returnまたはできるだけ少なくしてください。

レビュータイプの質問については、codereview.stackexchange.comもご利用ください。

public boolean test(boolean var){ 
    boolean flag; 
    if (var == true){ 
     flag = true; 
    } 
    return flag; 
} 
+0

-1:「それはもっときれいです」私はあなたに同意しますが、誰も気にしません。 (それを取り除くと-1を削除します) – haylem

+0

-1に投票してもらえればうれしいです。最初の方が読み手には理由がない「else」を読まなくて済むようになっています。価値に加わる。 – Shahzeb

+1

再度:私はあなたに同意します。しかし、それは "それは美しい"主観的な声明ですが、それは根拠がありません。 – haylem

0

  • 、コンパイラはまったく同じバイトコードに2つのバージョンを最適化しますので、何のパフォーマンスの違いはスタイルの面では

  • ありません一般的に合意されたルールはない。一部のチームでは、elseを冗長性のままにしておく方が好きですし、他のチームはあなたの意図をより代表的なものとして含めることを好みます。個人的には、私は偶発的なエラーをキャッチするので、elseを含める方に傾いています。

例:

public Object foo(int i) { 
    if(i > 0) { 
    this.someMethod(); // !! Opps forgot to "return" here. 
    } 
    return this.anotherMethod(); // This method always returns 'anotherMethod' 
} 

編集:私は私の最初のバージョンからの確定申告を逃していた、私はそれが私のポイントを証明することができます推測;))

あった場合elseelse return this.anotherMethod())だった場合、コンパイラは最初のブランチが決して値を返さないというエラーを返します。だから、私はelseを置くことで、エラーを捕捉するのに役立ちます。

もっと一般的なケース(elseを含めるかどうかについて)では、コンパイラが簡単な例のように簡単に最適化できない場合があります。その場合、elseを省略すると、バイトコードの命令が少なくなりますが、高速であるかどうかは、実行しているJVM、JIT、およびCPUによって異なります。

これらの最適化の種類は、非常にです。心配することはめったにありません。常にあなたと(あなたのチームメイトが)読みやすく+保守性が高いと思います。

+0

Javaは、最後の文(たとえば、OzやPascalなど)の戻り式を返しません。あるいは、anotherMethodが常に呼び出され、返されないと言うことを意図していたかもしれません。 Eitheの方法、あなたは説明が非常に明確ではありません。 – haylem

+0

申し訳ありませんが、私はそこにいたはずの返信文を逃しました。私はなぜ私が他の人を入れるのが好きなのかを証明したと思います - 私は帰りの声明が紛れて犠牲になるというひどい傾向があります。 – Tim

+1

または、あなたは、異なる "可能な値を持つ単一のreturn文を使用するようにコードを編成する方が良いかもしれないことを証明しただけで、同じ" check "を生成します(トレースしやすくなります)。 ... – haylem

6

これらはまったく同じです。この近代的なコンパイラのような小さなものでOfenはあなたのために最適化されます、javacはこれを行います。

public class IsElseFaster { 
    public boolean test1(boolean var) { 
     if (var == true) { 
      return true; 
     } 
     return false; 
    } 

    public boolean test2(boolean var) { 
     if (var == true) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

javacでコンパイルしてコピーしてください。あなたは方法は、あなたがの.classファイルを取得時まで全く同じで見ることができるように

public boolean test1(boolean); 

    Code: 
    0: iload_1 
    1: iconst_1 
    2: if_icmpne 7 
    5: iconst_1 
    6: ireturn 
    7: iconst_0 
    8: ireturn 

public boolean test2(boolean); 
    Code: 
    0: iload_1 
    1: iconst_1 
    2: if_icmpne 7 
    5: iconst_1 
    6: ireturn 
    7: iconst_0 
    8: ireturn 

:そして、あなたは次のような出力が得られますjavap -c IsElseFaster を実行します。

関連する問題