Java新手:功能定义的两种方式是否相同

时间:2012-11-06 13:26:38

标签: java function

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

方式1:

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

}

方式2:

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

我可以说上面两种创建返回布尔值的函数的方法是等于/相同吗?逻辑上有什么不同吗?

5 个答案:

答案 0 :(得分:11)

确定。它们在语义上是平等的。

然而,

更好:

public boolean isRight(){
      return CONDITION;
}

答案 1 :(得分: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表示程序员没有意识到这是不必要的。

答案 2 :(得分: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()

答案 3 :(得分:0)

是。它们完全一样。

答案 4 :(得分:0)

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