IT story

대문자로 "정적 최종 로거"를 선언해야합니까?

hot-time 2020. 4. 16. 08:32
반응형

대문자로 "정적 최종 로거"를 선언해야합니까?


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.


PMD가 의견을 존중한다는 것을 잊지 마십시오

// NOPMD

그 안에. 이렇게하면 PMD가 검사에서 라인을 건너 뛰게되므로 원하는 스타일을 선택할 수 있습니다.


일반적으로 상수는 대문자입니다.

그러나 로거는 정적이 아니어야하지만 slf4j 파사드를 사용하는 경우 포함하는 클래스의 모든 "새"항목을 찾아야합니다. 이것은 특히 웹 컨테이너에서 불쾌한 클래스 로더 문제를 피하고 로거 프레임 워크가 호출 컨텍스트에 따라 특별한 작업을 수행 할 수있게합니다.


코딩 표준 (있는 경우)은 대문자 여야한다고 말합니다.

나는 어떤 식 으로든 엄격한 이유를 찾지 못했습니다. 나는 그것이 당신의 개인적인 좋아하는 resp에 전적으로 달려 있다고 생각합니다. 회사 코딩 표준.

BTW : "LOGGER"를 선호합니다 ;-)


나는 'logger', 즉 소문자를 선호합니다. 그 이유는 상수이거나 상수가 아니기 때문입니다 (변경 가능 또는 변경 불가능). 그 추론을 사용한다면, 로깅 프레임 워크를 변경하거나 프레임 워크가 로거의 변경 성을 변경하면 변수의 이름을 바꿔야합니다.

저에게는 다른 이유가 더 중요합니다.

  1. 로거는 클래스의 섀도우 개체이며 기본 논리를 구현하지 않으므로 눈에 띄지 않아야합니다. 'LOGGER'를 사용하면 코드에서 너무 많은 관심을 끄는 눈길을 끄는 것입니다.

  2. 때때로 로거는 인스턴스 레벨에서 선언되고 (정적이 아닌) 심지어 의존성으로 주입되기도합니다. 로거를 얻는 방법을 변경하기로 결정한 경우 코드를 변경하고 싶지 않습니다. 코드 안정성 wrt. 이것이 (많은 경우의 가상의) 변화는 내가 소문자를 선호하는 또 다른 이유입니다.

참고 URL : https://stackoverflow.com/questions/1417190/should-a-static-final-logger-be-declared-in-upper-case

반응형