如果我创建一个返回布尔值的函数,我无法区分以下两种方式:
方式1:
public boolean isRight(){
if(CONDITION){
return true;
}else{
return false;
}
}
方式2:
public boolean isRight(){
if(CONDITION){
return true;
}
return false;
}
我可以说上面两种创建返回布尔值的函数的方法是等于/相同吗?逻辑上有什么不同吗?
答案 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)
它们完全相同,但第二个对我来说更好,因为您可以快速识别返回的默认值。有些人会说第一个片段更具可读性,但这是你喜欢的。