UPER-CASE에서 "정적 최종 로거"를 선언해야 하는가?
자바에서 정적 최종 변수는 상수이며, 상수는 대문자여야 한다는 것이 관례다.그러나 나는 대부분의 사람들이 Logger를 소문자로 신고하는 것을 보아왔는데, 이것은 PMD에서 위반으로 나타난다.
예:
private static final Logger logger = Logger.getLogger(MyClass.class);
구글어 SO에서 "정적 최종 로거"를 검색하면 직접 확인할 수 있다.
대신 로거로 할까?
로거 참조는 상수가 아니라 최종 참조로, 대문자로 되어서는 안 된다.상수 값은 대문자여야 한다.
private static final Logger logger = Logger.getLogger(MyClass.class);
private static final double MY_CONSTANT = 0.0;
크런치독의 대답에 더 많은 가치를 더하기 위해, Java Coding Style Guide는 이것을 3.3항 필드 명명(Field Naming)에 명시하고 있다.
상수로 사용되는 필드의 이름은 모두 대문자여야 하며 밑줄은 단어를 구분해야 한다.다음은 상수로 간주된다.
- 전부
static final
원시 유형(모든 인터페이스 필드는 본질적으로 존재한다는 점을 기억하십시오.static final
).- 전부
static final
" 뒤에 오는 법이 없는 개체 참조 유형..
" (점).- 전부
static final
따라가지 "다다다는 것은 은이다"이다.[
괄호 ( (개방형)예:
MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME
관습에 이 관습에 따라,logger
a이다static final
점 2에 명시된 바와 같이 객체 참조가 뒤따르기 때문에 ".
"사용할 때마다 상수로 간주할 수 없으므로 케이스가 낮아져야 한다.
효과적인 자바로부터, 2번째 에드가,
이전 규칙의 유일한 예외는 "정수 필드"에 관한 것이며, 이름은 예를 들어 VALUES 또는 NEGENT_INFINITY와 같이 밑줄 문자로 구분된 하나 이상의 대문자로 구성되어야 한다.상수 필드는 값이 불변인 정적 최종 필드다.정적 최종 필드가 원시 유형 또는 불변의 참조 유형(항목 15)을 갖는 경우, 상수 필드인 것이다.예를 들어 열거 상수는 상수 필드다.정적 최종 필드가 변이 가능한 참조 유형을 갖는 경우, 참조된 객체가 불변한 경우에도 상수 필드가 될 수 있다.
요약하면 상수 == 정적 결승에 더하여 참조(단순 유형)인 경우 불변성.
slf4j 로거를 보면 http://www.slf4j.org/api/org/slf4j/Logger.html
불변이다.반면에 JUL 로거는 변덕스럽다.log4j 로거도 변이 가능하다.그러니까 정확하게는 log4j나 JUL을 사용하고 있다면 '로거'여야 하고, slf4j를 사용하고 있다면 로거여야 한다.
위에 링크된 slf4j 자바도크 페이지에 "LOGER"가 아닌 "LOGER"를 사용하는 예가 있다는 점에 유의하십시오.
이것들은 물론 관습일 뿐이지 규칙이 아니다.slf4j를 사용하는 경우 다른 프레임워크의 로거에 익숙하기 때문에 "logger"를 사용하려는 경우 또는 입력하기 더 쉬우거나 가독성을 위해 계속 진행하십시오.
나는 구글이 그것을 받아들이는 것을 좋아한다(Google Java Style)
모든 상수가 정적 최종 필드지만 모든 정적 최종 필드가 상수인 것은 아니다.상수 대소문자를 선택하기 전에 필드가 상수처럼 느껴지는지 여부를 고려하십시오.예를 들어, 만약 그 사례의 관찰 가능한 상태가 변할 수 있다면, 그것은 거의 확실히 상수가 아니다.단지 그 대상을 절대로 변이하지 않으려는 의도만으로는 일반적으로 충분하지 않다.
예:
// 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에서의 규약은 공공 정적 상수에 대한 대문자다.분명히 로거는 일정하지 않지만 변이 가능한 것을 나타낸다. (그렇지 않으면 어떤 일이 일어나기를 바라는 마음에서 그 위에 방법을 호출하는 것은 의미가 없을 것이다.); 일정하지 않은 최종 분야에 대한 구체적인 표준은 없다.
만약 당신이 이것을 검색한다면, 당신은 어떤 경우에 로거가 정적 결승전으로 정의되지 않았다는 것을 발견할 수 있다.여기에 복사-n-paste를 첨가하면, 이것이 그것을 설명할 수 있다.
우리는 모든 코드에 LOGER를 사용하며, 이것은 우리의 명명 규칙에 해당된다(그리고 우리의 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
그러나 만약 당신이 엄격하게 현학적으로 행동할거라면, 사용하라.LOGGER
.
PMD가 다음 코멘트를 존중한다는 것을 잊지 마십시오.
// NOPMD
이것은 PMD가 체크에서 선을 건너뛰게 할 것이고, 이것은 당신이 원하는 스타일을 선택할 수 있게 할 것이다.
보통 상수는 대문자로 되어 있다.
그러나 로거는 정적이어서는 안 되며 slf4j facade를 사용할 경우 포함된 클래스의 모든 "new"를 검색해야 한다.이것은 특히 웹 용기의 고약한 클래스 로더 문제를 방지하고, 로거 프레임워크가 호출 상황에 따라 특별한 일을 할 수 있게 해준다.
코딩 표준이 있으면 대문자여야 한다고 말하면 그렇다.
이러쿵저러쿵 엄중한 이유는 보이지 않는다.내 생각에 그것은 전적으로 너의 개인적인 취향에 달려있는 것 같아.귀사의 코딩 표준.
BTW: "LOGER" ;-)
나는 '로거' 즉, 소문자를 선호한다.그 이유는 상수(상수 또는 불변)가 아니어서가 아니다.그 추론을 사용한다면, 만약 우리가 로깅 프레임워크를 변경한다면(또는 그 프레임워크가 로거의 변이성을 변경한다면) 변수 이름을 바꿔야 할 것이다.
나에겐 다른 이유가 더 중요해.
로거는 학급에서 그림자 물체로, 주 논리를 구현하지 않기 때문에 크게 두드러져서는 안 된다.'LOGER'를 사용하면 너무 많은 관심을 끄는 코드 속 아이캐쳐다.
때때로 로거는 인스턴스 레벨에서 선언되고(즉, 정적 레벨이 아님), 종속성으로 주입되기도 한다.내가 로거 받는 방법을 바꾸기로 결정한다면 나는 코드를 바꾸고 싶지 않다.코드 안정성은 wrt. 이 (많은 경우에서 광학적으로) 변화가 내가 소문자를 선호하는 또 다른 이유다.
참조URL: https://stackoverflow.com/questions/1417190/should-a-static-final-logger-be-declared-in-upper-case
'programing' 카테고리의 다른 글
오류: 알 수 없는 유형 이름 'bool' (0) | 2022.05.07 |
---|---|
기본값을 방지한 다음 VueJ를 사용하여 기본값을 제출하는 방법s (0) | 2022.05.07 |
Vue에서 슬롯을 업데이트하는 방법.JS (0) | 2022.05.07 |
Vue 3 마이그레이션 구성 요소의 확장 방법 (0) | 2022.05.07 |
이 비즈니스 논리는 Vuex에 얼마나 속하는가? (0) | 2022.05.07 |