[java] 대문자로 “정적 최종 로거”를 선언해야합니까?

Java에서 정적 최종 변수는 상수이며 규칙은 대문자 여야한다는 규칙입니다. 그러나 대부분의 사람들은 로거를 소문자로 선언하여 PMD 에서 위반으로 나타납니다 .

예 :

private static final Logger logger = Logger.getLogger(MyClass.class);

그냥 검색 구글 이나 SO “정적 최종 로거를위한”당신은 자신이 표시됩니다.

대신 LOGGER를 사용해야합니까?



답변

로거 참조는 상수가 아니라 최종 참조이며 대문자가 아니어야합니다. 상수 VALUE는 대문자 여야합니다.

private static final Logger logger = Logger.getLogger(MyClass.class);

private static final double MY_CONSTANT = 0.0;


답변

crunchdog의 답변에 더 많은 가치를 더하기 위해 Java 코딩 스타일 가이드 는 3.3 절의 필드 이름 지정에이를 설명합니다.

상수 로 사용되는 필드 이름은 모두 대문자 여야하며 밑줄로 단어를 구분해야합니다. 다음은 상수로 간주됩니다.

  1. 모든 static final기본 유형 ( 모든 인터페이스 필드는 기본적으로 있음을 기억하십시오 static final).
  2. static final.“(점)이 뒤 따르지 않는 모든 객체 참조 유형 .
  3. static final[“(대괄호 열기)가 뒤 따르지 않는 모든 배열 .

예 :

MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME

이 규칙에 따라, loggerA는 static final점 2에 명시된 바와 같이 객체 참조하지만,이 때문에 한다 “다음에 .당신이 그것을 사용할 때마다”, 그것은 상수로 간주 할 수 없으며, 따라서 소문자이어야한다.


답변

효과적인 자바에서, 2nd ed.,

이전 규칙에 대한 유일한 예외는 이름이 밑줄 문자로 구분 된 하나 이상의 대문자로 구성되어야하는 “일정 필드”와 관련이 있습니다 (예 : VALUES 또는 NEGATIVE_INFINITY). 상수 필드는 값을 변경할 수없는 정적 최종 필드입니다 . 정적 최종 필드에 기본 유형 또는 변경 불가능한 참조 유형 (항목 15)이 있으면 상수 필드입니다. 예를 들어 열거 형 상수는 상수 필드입니다. 정적 최종 필드에 변경 가능한 참조 유형이있는 경우 참조 된 오브젝트가 변경 불가능한 경우에도 여전히 상수 필드 일 수 있습니다.

요약하면, constant == static final, 그리고 참조 인 경우 (단순한 유형), 불변성.

slf4j 로거를 보면
http://www.slf4j.org/api/org/slf4j/Logger.html

불변입니다. 한편, JUL 로거는 변경 가능합니다. log4j 로거도 변경 가능합니다. 따라서 log4j 또는 JUL을 사용하는 경우 “logger”여야하고 slf4j를 사용하는 경우 LOGGER 여야합니다.

위에 링크 된 slf4j javadocs 페이지에는 “LOGGER”가 아닌 “logger”를 사용하는 예가 있습니다.

이것은 물론 규칙이 아니라 관습 일뿐입니다. slf4j를 사용하고 있고 다른 프레임 워크에서 사용하기 때문에 “로거”를 사용하려는 경우 또는 입력하기 쉬운 또는 가독성을 높이려면 계속하십시오.


답변

나는 구글이 그것을 좋아한다 ( 구글 자바 스타일 )

모든 상수는 정적 최종 필드이지만 모든 정적 최종 필드가 상수는 아닙니다. 일정한 대소 문자를 선택하기 전에 필드가 실제로 일정하게 느껴지는 지 고려하십시오. 예를 들어, 해당 인스턴스의 관찰 가능한 상태 중 하나라도 변경 될 수있는 경우 거의 일정하지 않습니다. 객체를 절대로 변경하지 않는 것은 일반적으로 충분하지 않습니다.

예 :

// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(',');  // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};


답변

자동 도구를 사용하여 코딩 표준을 확인하고 해당 표준을 위반하는 경우 해당 도구 또는 표준을 수정해야합니다. 외부 표준을 사용하는 경우 코드를 수정하십시오.

Sun Java의 규칙은 공용 정적 상수의 대문자입니다. 분명히 로거는 일정하지 않지만 변경 가능한 것을 나타냅니다 (그렇지 않으면 어떤 일이 일어날 것이라는 희망으로 메소드를 호출하는 데 아무런 포인트가 없습니다). 일정하지 않은 최종 필드에 대한 특정 표준은 없습니다.


답변

당신이 구글을 검색하면 경우에 따라 로거가 정적 인 최종으로 정의되지 않은 것을 알 수 있습니다. 여기에 빠른 복사 후 붙여 넣기를 추가하면 설명이됩니다.

우리 는 모든 코드에서 LOGGER사용 하며 이는 명명 규칙에 해당합니다 (CheckStyle도 만족합니다).


우리는 Eclipse의 엄격한 명명 규칙을 활용하여 더 나아가고 있습니다. 다음과 같은 코드 템플릿으로 새 클래스를 만듭니다.

    // private static final Logger LOGGER = Logger.getLogger(${enclosing_type}.class);

로거는 처음에는 필요하지 않으므로 주석 처리됩니다. 그러나 나중에 필요하면 주석 처리를 제거하십시오.

그런 다음 코드에서이 로거가 존재할 것으로 예상되는 코드 템플릿을 사용합니다. try-catch 템플릿을 사용한 예 :

    try {
      ${cursor} or some other template
    } catch (Exception t) {
      LOGGER.error("${methodName} ${method parameters}", t);
    }

이를 사용하는 템플릿이 몇 가지 더 있습니다.

엄격한 규칙은 우리가 생산성과 코드 템플릿과 일관성이 될 수 있습니다 .


답변

나는 개인적으로 그것이 대문자로 정말로 크게 보인다고 생각합니다. 또한 클래스 동작과 직접 관련이없는 클래스이므로 logger대신을 사용하는 데 큰 문제가 없습니다 LOGGER. 그러나 엄격하게 pedantic이 되려면을 사용하십시오 LOGGER.