Java中条件表达式中的ENUM用法

时间:2018-04-13 21:10:11

标签: java if-statement enums

我有一个简单的java if条件,带有布尔比较和枚举比较。

if(testBoolean && testEnumObj != TestEnum.Test) {
   //TO DO:
}

出于性能原因,我得到了我的主管的建议,将其分成两块。我想确认上面的表达式是否会对性能或内存占用产生影响,而不是像下面那样有两个if块。

if(testBoolean) {
   if(testEnumObj != TestEnum.Test) {
     // TO DO:
   }
}

在将第一个表达式分成第二个表达式时,我没有看到任何性能提升。只是想确认支持我的评论员的论点。

3 个答案:

答案 0 :(得分:3)

没有任何改进,因为&&是一个短路算子,如果第一个是false,则不会评估第二个条件。这在JLS §15.23. Conditional-And Operator &&

中有解释
  

在运行时,首先计算左侧操作数表达式;如果结果具有布尔类型,则进行拆箱转换(§5.1.8)。

     

如果结果值为false,则条件表达式和表达式的值为false,并且不评估右侧操作数表达式。

如果您使用&,则会有所不同testBoolean & testEnumObj != TestEnum.Test会评估这两个条件,但将其切换为&&而不是使用嵌套的if语句会更具可读性。

答案 1 :(得分:2)

我认为审稿人的关注点应该是可读性而不是性能。一般来说,出于性能原因而在此级别更改代码是一个坏主意;而符合适用的可读性标准是支持其中一种形式优于另一种形式的正当理由。

那就是说,我的钱似乎是

if(testBoolean && (testEnumObj != TestEnum.Test)) {
 //TO DO:
}

比上述任何一种方式更接近正确,因为

(1)你的方式让某人停下来思考行动的顺序

(2)"纠正"方式浪费了一个缩进级别

答案 2 :(得分:1)

以下基本类与给定的ur代码具有相同的条件

class sovjava{

    public  static void main(String ...a){
        boolean i=true;
        boolean j=true;

        if(i && j){

        }
        if(i){
            if(j){

            }
        }
    }
}

//这是javap -c sovjava从5到17看到的字节代码,观察到两者都会转换成相同的

Compiled from "sovjava.java"
class sovjava {
  sovjava();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String...);
    Code:
       0: iconst_1
       1: istore_1
       2: iconst_1
       3: istore_2
       4: iload_1
       5: ifeq          12
       8: iload_2
       9: ifeq          12
      12: iload_1
      13: ifeq          20
      16: iload_2
      17: ifeq          20
      20: return
}

在比较条件

方面两者相同