3

如果我创建一个返回布尔值的函数,我无法区分以下两种方式:

方式一:

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

}

方式2:

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

我可以说创建返回布尔值的函数的上述两种方法是相等/相同的吗?逻辑上有区别吗?

4

5 回答 5

11

当然。它们在语义上是相等的。

然而,更好的是:

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

没有一个比另一个更有效。编译器可以很容易地看出两者是相同的,实际上 Suns/Oracles javac 为这两种方法生成了相同的字节码。

这是一个 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语句之后,CONDITION保证是假的。

虽然这实际上是一个无用的说法。只需使用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

它们绝对相同,但第二个对我来说更好,因为您可以快速识别返回的默认值。有些人会说第一个片段更具可读性,但它是你喜欢的。

于 2012-11-06T13:30:13.000 回答