내가 좋아하는 부울 필드가있는 경우 : 나는 다음과 같은 문장이자바 처리기
private static final boolean DEBUG = false;
내 코드 내에서 :
if(DEBUG) System.err.println("err1");
자바 전처리 그냥 경우 제거 않습니다 진술과 연결할 수없는 코드?
내가 좋아하는 부울 필드가있는 경우 : 나는 다음과 같은 문장이자바 처리기
private static final boolean DEBUG = false;
내 코드 내에서 :
if(DEBUG) System.err.println("err1");
자바 전처리 그냥 경우 제거 않습니다 진술과 연결할 수없는 코드?
대부분의 컴파일러는이 문구를 제거합니다. 예를 들어 :
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
! :)
+1 직접 테스트하는 방법에 대한 안내입니다. – akf
또한'if (DEBUG && condition_that_may_be_true) ... '와 같은 명령문이 있는지 확인하고'DEBUG'가 항상 거짓이면 명령문을 잘라냅니다. – twolfe18
+1 모델 답변 – butterchicken
예, Java 컴파일러는 상수에 의해 제어되는 블록 if
내의 컴파일 된 코드를 제거합니다. 이는 프로덕션 빌드에 포함하지 않으려는 "디버그"코드를 조건부로 컴파일하는 데 사용할 수있는 방법입니다.
Java Language Specification 페이지에 이것을 설명해 주시겠습니까? – Ralph
@Ralph : JLS 토론에 대한 내용은 [14.21 연결할 수없는 문] (http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.21)을 참조하십시오. 'if' 문에 관한 비트는 그 섹션의 끝 부분 근처에 있습니다. –
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 –
"Java 언어에는 전처리 기가 없습니다."(http://java.sun.com/developer/JDCTechTips/2003/tt0408.html) Java 컴파일러에 대해 이야기하고 있습니까? –
기사를 주셔서 감사합니다. Java에 전 처리기가 없다는 것을 알지 못했습니다. 그래서 저는 컴파일러에 대해서 이야기하고 있습니다. – twolfe18
Java에 C/C++과 동일한 기능을 가진 전 처리기가 없다는 것은 사실입니다. 그러나 컴파일 타임 처리 기능을 제공하는 주석 처리기가 있습니다. [Oracle 's Annotations Tutorial] (http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html) – KomodoDave