3

ブール値を返す関数を作成すると、次の 2 つの方法の違いがわかりません。

方法 1:

public boolean isRight(){
      if(CONDITION){
          return true;
      }else{
          return false;
      }

}

方法 2:

public boolean isRight(){
      if(CONDITION){
          return true;
      }
      return false;
}

ブール値を返す関数を作成する上記の 2 つの方法は、等しい/同一であると言えますか? 論理的に違いはありますか?

4

5 に答える 5

11

もちろん。それらは意味的に等しい。

ただし、さらに良い:

public boolean isRight(){
      return CONDITION;
}
于 2012-11-06T13:27:46.653 に答える
4

どちらか一方が他方よりも効率的というわけではありません。コンパイラは、この 2 つが同一であることを簡単に確認できます。実際、Suns/Oracle の javac は、2 つのメソッドに対して同一のバイトコードを生成します。

以下は IfTest クラスです。

lass IfTest {

public boolean eq1(Object obj) {
    if (this == obj)
        return true;

    if (obj == null)
        return false;

    if (getClass() != obj.getClass())
        return false;

    return true;
}


public boolean eq2(Object obj) {

    if (this == obj)
        return true;

    else if (obj == null)
        return false;

    else if (getClass() != obj.getClass())
        return false;

    return true;
}

}

javac でコンパイルしたところ、逆アセンブルは次のようになりました。

public boolean eq1(java.lang.Object);
  Code:
   0:   aload_0
   1:   aload_1
   2:   if_acmpne   7
   5:   iconst_1
   6:   ireturn
   7:   aload_1
   8:   ifnonnull   13
   11:  iconst_0
   12:  ireturn
   13:  aload_0
   14:  invokevirtual   #2; //Method Object.getClass:()Ljava/lang/Class;
   17:  aload_1
   18:  invokevirtual   #2; //Method Object.getClass:()Ljava/lang/Class;
   21:  if_acmpeq   26
   24:  iconst_0
   25:  ireturn
   26:  iconst_1
   27:  ireturn

public boolean eq2(java.lang.Object);
  Code:
   0:   aload_0
   1:   aload_1
   2:   if_acmpne   7
   5:   iconst_1
   6:   ireturn
   7:   aload_1
   8:   ifnonnull   13
   11:  iconst_0
   12:  ireturn
   13:  aload_0
   14:  invokevirtual   #2; //Method Object.getClass:()Ljava/lang/Class;
   17:  aload_1
   18:  invokevirtual   #2; //Method Object.getClass:()Ljava/lang/Class;
   21:  if_acmpeq   26
   24:  iconst_0
   25:  ireturn
   26:  iconst_1
   27:  ireturn

つまり、最初のバージョン (else なし) を使用することをお勧めします。else の部分を使った方がきれいだと主張する人もいるかもしれませんが、私はその反対です。else を含めることは、プログラマーがそれが不要であることを認識していなかったことを示しています。

于 2012-11-06T13:38:36.493 に答える
1

はい、それらは同一です。これは、最初のreturnステートメントの後、 CONDITIONfalseであることが保証されているためです。

これは実際には役に立たないステートメントですが。も常に同等であるため、CONDITIONの代わりに使用してください。isRight()

したがって、これらはすべて同等です。

public boolean isRight() {
    if (CONDITION) { return true; }
    else { return false; }
}

public boolean isRight() {
    if (CONDITION) { return true; }
    return false;
}

public boolean isRight() {
    return CONDITION;
}

CONDITION

彼らは...同じです。isRight()を返すだけCONDITIONなのでCONDITION、の代わりに使用する必要がありisRight()ます。

于 2012-11-06T13:28:05.367 に答える
0

はい。それらはまったく同じです。

于 2012-11-06T13:28:14.940 に答える
0

それらはまったく同じですが、返されたデフォルト値をすぐに識別できるため、2 番目の方が適しています。最初のスニペットの方が読みやすいと言う人もいますが、お好みでどうぞ。

于 2012-11-06T13:30:13.000 に答える