2011-03-20 5 views
5

생산 단계에서 로거로 인쇄 할 수 있어야하지만 개발 중에는 콘솔로 인쇄하고 싶습니다. 그래서 C++에서 나는 단순히 매크로를 사용할 것이고, 그것은 1 라인의 변경이 될 것입니다. 어떻게 자바에서 그렇게 할 수 있습니까? 감사합니다.자바에서 매크로를 구현하는 방법

+0

Java 또는 매크로를 사용하여 로깅을 구현/사용 하시겠습니까? –

+0

Java에는 매크로가 없지만 동적 인 이점이 있습니다. 즉, 런타임시 C++에서 컴파일 타임에 비활성화해야하는 무언가를 효율적으로 비활성화 할 수 있음을 의미합니다. Java는 다양한 옵션을 켜거나 끄기 위해 많은 버전의 코드를 컴파일 할 필요가 없습니다. 실제로 사용되는 방법에 따라 코드를 최적화하여이를 수행 할 수 있습니다. –

답변

2

그냥 정적 메서드를 정의하고 호출하십시오. 그 방법에서는 디버그 할 때 true으로 설정된 상수를 넣고 디버깅 여부에 따라 다른 코드를 실행합니다.

3

봐 좋은 로깅 프레임 워크가 사용, 정답이 아니다. SLF4J (또는 이전 log4j)을보십시오. 로깅 호출을이 Facade 중 하나를 통해 라우팅하면 로깅 된 메시지를 콘솔이나 파일 또는 작은 구성으로 원하는 다른 appender로 보낼 수 있습니다.

4

자바에는 C/C++과 유사한 매크로가 없으므로 모든 로깅 코드를 자동으로 비활성화하는 쉬운 방법은 없습니다. 생산 빌드에서 프로그램 어디에서든 당신의 이벤트를 기록하려면 즉, 당신은 당신이이 출력을 침묵 할 수

Utility.log("Here's a message!"); 

를 호출 할 수 있습니다, 지금

public class Utility { 
    private Utility() {} // Singleton 

    public static void log(String toLog) { 
     System.out.println(toLog); 
    } 
    /* ... etc. ... */ 
} 

: 당신이 할 수있는 것은이 같은 것입니다 log의 구현을 no-op로 변경하면됩니다.

이것은 C/C++만큼 효율적이지 않습니다. 단지 로깅 매크로를 컴파일 할 때 아무 것도하지 않아도된다는 것이지만 좋은 옵티 마이저/JIT는 인수가 사용되지 않고 있음을 알 수 있어야합니다. 논리를 최적화하여 이러한 인수를 설정하십시오.

1

Java는 전처리기를 직접 지원하지 않으므로 매크로를 지원하지 않습니다.

그러나 로깅은 일반적인 요구 사항이므로 선택할 수있는 몇 가지 옵션이 있습니다. 현재 최상의 방법은 slf4j (좋은 코드를 허용하는 {} 구조로)를 적절한 백엔드와 함께 사용하는 것입니다. 우선 slf4j 배포본의 "slf4j-simple"백엔드가 좋다.

slf4j 작성자는 로그백 백엔드를 강력히 선호합니다. 지금은 그럴 필요가 없습니다.

0

내 대답은 약간 늦었습니다. 4 년! :)

단지 기록을 위해, 매크로를 사용해야 할 경우 컴파일하기 전에 Java 코드를 통해 C++ 전 처리기를 실행하면됩니다. 물론 이것은 C++ 매크로 구문을 사용한다고 가정합니다.

당신이 무엇을 기억하지 않는 경우

는, 프리 프로세서는 #define을 항목을 ... 대체 내가 위의 동의 말했다

- 그것은 어리석은 조금 이럴 있지만 (괜찮은 프레임 워크를 사용 Java에서 매크로를 가지지 않음).

관련 문제