views:

887

answers:

2
+3  Q: 

Java Preprocessor

If I have a boolean field like:

private static final boolean DEBUG = false;

and within my code I have statements like:

if(DEBUG) System.err.println("err1");

does the Java preprocessor just get rid of the if statement and the unreachable code?

+2  A: 

Yes, the Java compiler will eliminate the compiled code within if blocks that are controlled by constants. This is an acceptable way to conditionally compile "debug" code that you don't want to include in a production build.

Greg Hewgill
@Greg Hewgill: Can you give the Java Language Specification page that states this?
Ralph
@Ralph: See [14.21 Unreachable Statements](http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21) for the discussion in the JLS. The bit about the `if` statement is right near the end of that section.
Greg Hewgill
+15  A: 

Most compilers will eliminate the statement. For example:

public class Test {

    private static final boolean DEBUG = false;

    public static void main(String... args) {
     if (DEBUG) {
      System.out.println("Here I am");
     }
    }

}

After compiling this class, I then print a listing of the produced instructions via the javap command:

javap -c Test
    Compiled from "Test.java"
    public class Test extends java.lang.Object{
    public Test();
      Code:
       0:   aload_0
       1:   invokespecial #1; //Method java/lang/Object."":()V
       4:   return

    public static void main(java.lang.String[]);
      Code:
       0:   return

    }

As you can see, no System.out.println! :)

Adam Paynter
+1 for the instruction on how test it yourself.
akf
twolfe18
+1 model answer
butterchicken