Search code examples
javadebuggingif-statementfinal

How smart is Java about if statements with final variables


I'd like to write some troubleshooting code which i can easily remove from later non debug versions of my program. I came up with:

final static boolean debug_on=true;
...
if (debug_on) { system.out.println() or logger.log(...) }

Is Java smart enough to drop the if statement from the final bytecode if debug==false ?

Is there a better practice to achieve the goal of keeping debug code out of the final version of a program ?


Solution

  • See the end of the Java language specification chapter 14.21. Unreachable Statements for a description of if(false):

    if (false) { x=3; }
    

    does not result in a compile-time error. An optimizing compiler may realize that the statement x=3; will never be executed and may choose to omit the code for that statement from the generated class file, but the statement x=3; is not regarded as "unreachable" in the technical sense specified here.

    The rationale for this differing treatment is to allow programmers to define "flag variables" such as:

    static final boolean DEBUG = false;
    

    and then write code such as:

    if (DEBUG) { x=3; }
    

    The idea is that it should be possible to change the value of DEBUG from false to true or from true to false and then compile the code correctly with no other changes to the program text.

    tl;dr; It depends on the compiler whether the statements inside your if are omitted in the bytecode.