#ifdef #ifndef in Java #ifdef #ifndef in Java java java

#ifdef #ifndef in Java


private static final boolean enableFast = false;// ...if (enableFast) {  // This is removed at compile time}

Conditionals like that shown above are evaluated at compile time. If instead you use this

private static final boolean enableFast = "true".equals(System.getProperty("fast"));

Then any conditions dependent on enableFast will be evaluated by the JIT compiler. The overhead for this is negligible.


javac will not output compiled code that is unreachable. Use a final variable set to a constant value for your #define and a normal if statement for the #ifdef.

You can use javap to prove that the unreachable code isn't included in the output class file. For example, consider the following code:

public class Test{   private static final boolean debug = false;   public static void main(String[] args)   {       if (debug)        {           System.out.println("debug was enabled");       }       else       {           System.out.println("debug was not enabled");       }   }}

javap -c Test gives the following output, indicating that only one of the two paths was compiled in (and the if statement wasn't):

public static void main(java.lang.String[]);  Code:   0:   getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;   3:   ldc     #3; //String debug was not enabled   5:   invokevirtual   #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V   8:   return


I think that I've found the solution, It's much simpler.
If I define the boolean variables with "final" modifier Java compiler itself solves the problem. Because it knows in advance what would be the result of testing this condition.For example this code:

    boolean flag1 = true;    boolean flag2 = false;    int j=0;    for(int i=0;i<1000000000;i++){        if(flag1)            if(flag2)                j++;            else                j++;        else            if(flag2)                j++;            else                j++;    }

runs about 3 seconds on my computer.
And this one

    final boolean flag1 = true;    final boolean flag2 = false;    int j=0;    for(int i=0;i<1000000000;i++){        if(flag1)            if(flag2)                j++;            else                j++;        else            if(flag2)                j++;            else                j++;    }

runs about 1 second. The same time this code takes

    int j=0;    for(int i=0;i<1000000000;i++){        j++;    }