Can the java compiler optimize this code?

Is the java compiler or runtime (or any other language compiler) smart enough to implement branch 3 can never happen and optimize it? I've seen this kind of "defensive programming" with many aspiring developers and wonder if this dead weight remains in the bytecode.

import java.util.Random;


class Example
{
    public static void main(String[] args) {
        int x = new Random().nextInt() % 10;
        if ( x < 5 )
        {
            System.out.println("Case 1");
        }
        else
            if ( x >= 5 )
            {
                System.out.println("Case 2");
            }
            else
            {
                System.out.println("Case 3");
            }

    }
}

      

or even this dumber case

boolean bool = new Random().nextBoolean();
if ( bool )
{
    System.out.println("Case 1");
}
else
    if ( bool )
    {
        System.out.println("Case 2");
    }

      

+3


source to share


1 answer


Java 8 compiler which doesn't seem to optimize it. Using "javap -c" to check bytecode after compilation:

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class java/util/Random
       3: dup
       4: invokespecial #3                  // Method java/util/Random."<init>":()V
       7: invokevirtual #4                  // Method java/util/Random.nextInt:()I
      10: bipush        10
      12: irem
      13: istore_1
      14: iload_1
      15: iconst_5
      16: if_icmpge     30
      19: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
      22: ldc           #6                  // String Case 1
      24: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      27: goto          54
      30: iload_1
      31: iconst_5
      32: if_icmplt     46
      35: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
      38: ldc           #8                  // String Case 2
      40: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      43: goto          54
      46: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
      49: ldc           #9                  // String Case 3
      51: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      54: return
}

      



The string "Case 3" still exists in byte code.

+4


source







All Articles