문제

Java에서는 정적 최종 변수가 상수이며 규칙은 상류에 있어야한다는 규칙입니다. 그러나 나는 대부분의 사람들이 위반으로 등장하는 소문자로 로거를 선언하는 것을 보았습니다. PMD.

예 :

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

그냥 검색 Google또는 그래서 "정적 최종 로거"의 경우 직접 볼 수 있습니다.

대신 로거를 사용해야합니까?

도움이 되었습니까?

해결책

로거 참조는 상수가 아니라 최종 참조이며 대문자에 있어서는 안됩니다. 일정한 값은 대문자 여야합니다.

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

private static final double MY_CONSTANT = 0.0;

다른 팁

Crunchdog의 답변에 더 많은 가치를 더하기 위해 자바 코딩 스타일 가이드 이것을 단락 3.3 필드 명명으로 나타냅니다

사용중인 필드의 이름 상수 단어를 분리하는 밑줄과 함께 모든 상부이어야합니다. 다음은 상수로 간주됩니다.

  1. 모두 static final 원시 유형 (기억하십시오 모두 인터페이스 필드는 본질적으로 있습니다 static final).
  2. 모두 static final 뒤 따르는 객체 참조 유형 "."(도트).
  3. 모두 static final 뒤 따르는 배열 ""["(도트).

예 :

MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME

이 협약에 이어 logger a static final 지점 2에 명시된 객체 참조이지만 ~이다 뒤 이어."당신이 그것을 사용할 때마다, 그것은 상수로 간주 될 수 없으므로 소문자가되어야합니다.

효과적인 Java, 2nd ed.,

이전 규칙에 대한 유일한 예외는“상수 필드”와 관련이 있으며, 그 이름은 밑줄 문자로 분리 된 하나 이상의 대문자 단어로 구성되어야합니다. 상수 필드는 값이 불변의 정적 최종 필드입니다.. 정적 최종 필드에 원시 유형 또는 불변의 참조 유형 (항목 15)이있는 경우 상수 필드입니다. 예를 들어, 열 상수는 일정한 필드입니다. 정적 최종 필드에 변이 가능한 기준 유형이있는 경우, 참조 된 객체가 불변 인 경우에도 여전히 상수 필드가 될 수 있습니다.

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

SLF4J 로거를보고http://www.slf4j.org/api/org/slf4j/logger.html

불변입니다. 반면에, 7 월 로거는 변동성이 있습니다. LOG4J 로거도 변이 가능합니다. 따라서 올바른 것은 Log4J 또는 Jul을 사용하는 경우 "Logger"여야하며 SLF4J를 사용하는 경우 Logger 여야합니다.

위에서 링크 된 SLF4J Javadocs 페이지에는 "Logger"가 아닌 "Logger"를 사용하는 예가 있습니다.

물론 규칙이 아니라 규칙 일뿐입니다. SLF4J를 사용하고 있고 다른 프레임 워크에서 익숙하거나 입력하기 쉬운 경우 "로거"를 사용하려는 경우 계속해서 계속 진행하십시오.

나는 Google의 테이크를 좋아한다 (Google Java 스타일)

모든 상수는 정적 최종 필드이지만 모든 정적 최종 필드가 상수는 아닙니다. 일정한 케이스를 선택하기 전에 필드가 실제로 일정하다고 느끼는 지 고려하십시오. 예를 들어, 해당 인스턴스의 관찰 가능한 상태가 변경 될 수 있다면 거의 확실하지 않습니다. 물체를 절대 돌리지 않으려는 것만으로는 일반적으로 충분하지 않습니다.

예 :

// 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"};

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

Sun Java의 컨벤션은 공공 정적 상수의 대문자입니다. 분명히 로거는 일정하지는 않지만 돌연변이가있는 것을 나타냅니다 (그렇지 않으면 무언가가 일어날 것이라는 희망에 따라 포인트 호출 방법이 없을 것입니다). 비정규 최종 필드에 대한 특정 표준은 없습니다.

Google이라면 경우에 따라 로거가 정적 최종으로 정의되지 않을 수 있습니다. 이것에 빠른 카피 -N- 페이스트를 추가하면 설명 할 수 있습니다.

우리는 로거를 사용합니다 우리의 모든 코드에서, 이것은 우리의 명명 규칙에 해당합니다 (그리고 우리의 점검 스타일은 그것에 만족합니다).


우리는 심지어 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 Facade를 사용하는 경우 포함 된 클래스의 모든 "새로운"을 찾아 보았습니다. 이는 특히 웹 컨테이너에서 불쾌한 클래스 로더 문제를 피하고 로거 프레임 워크가 호출 컨텍스트에 따라 특별한 작업을 수행 할 수있게합니다.

코딩 표준이있는 경우 (있는 경우) 대문자 여야한다고 말하십시오.

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

BTW : 나는 "로거"를 선호합니다 ;-)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top