2009-08-27 2 views
41

내가 좋아하는 부울 필드가있는 경우 : 나는 다음과 같은 문장이자바 처리기

private static final boolean DEBUG = false;

내 코드 내에서 :

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

자바 전처리 그냥 경우 제거 않습니다 진술과 연결할 수없는 코드?

+2

"Java 언어에는 전처리 기가 없습니다."(http://java.sun.com/developer/JDCTechTips/2003/tt0408.html) Java 컴파일러에 대해 이야기하고 있습니까? –

+0

기사를 주셔서 감사합니다. Java에 전 처리기가 없다는 것을 알지 못했습니다. 그래서 저는 컴파일러에 대해서 이야기하고 있습니다. – twolfe18

+0

Java에 C/C++과 동일한 기능을 가진 전 처리기가 없다는 것은 사실입니다. 그러나 컴파일 타임 처리 기능을 제공하는 주석 처리기가 있습니다. [Oracle 's Annotations Tutorial] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave

답변

109

대부분의 컴파일러는이 문구를 제거합니다. 예를 들어 :

public class Test { 

    private static final boolean DEBUG = false; 

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

} 

이 클래스를 컴파일 한 후, 나는 다음 javap 명령을 통해 생성 된 명령의 목록을 인쇄 :

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 

    } 

당신이 볼 수 있듯이, 아니 System.out.println! :)

+16

+1 직접 테스트하는 방법에 대한 안내입니다. – akf

+2

또한'if (DEBUG && condition_that_may_be_true) ... '와 같은 명령문이 있는지 확인하고'DEBUG'가 항상 거짓이면 명령문을 잘라냅니다. – twolfe18

+1

+1 모델 답변 – butterchicken

12

예, Java 컴파일러는 상수에 의해 제어되는 블록 if 내의 컴파일 된 코드를 제거합니다. 이는 프로덕션 빌드에 포함하지 않으려는 "디버그"코드를 조건부로 컴파일하는 데 사용할 수있는 방법입니다.

+0

Java Language Specification 페이지에 이것을 설명해 주시겠습니까? – Ralph

+3

@Ralph : JLS 토론에 대한 내용은 [14.21 연결할 수없는 문] (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21)을 참조하십시오. 'if' 문에 관한 비트는 그 섹션의 끝 부분 근처에 있습니다. –

+1

jse7에 대한 페이지가 여기에 있습니다. http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.21 및 여기 jse5에 대한 내용은 http://docs.oracle.com입니다. /javase/specs/jls/se5.0/html/statements.html#14.21 –