로거 스태틱파이널을 선언하는 이유는 무엇입니까?
Java에서는 로거를 선언하는 것이 왜 베스트 프랙티스입니까?static final
?
private static final Logger S_LOGGER
private
- 다른 클래스가 로거를 가로채지 못하도록 합니다.static
- 따라서 클래스당 로거 인스턴스는 1개뿐이므로 로거를 시리얼화하는 시도도 피할 수 있습니다.final
- 수업 기간 동안 로거를 변경할 필요가 없습니다.
그리고 나는 이름이 더 좋다.log
가능한 한 단순하면서도 설명적인 표현으로 표현해야 합니다.
편집: 단, 다음 규칙에는 흥미로운 예외가 있습니다.
protected final Logger log = LoggerFactory.getLogger(getClass());
대조를 이루다:
private static final Logger log = LoggerFactory.getLogger(Foo.class);
앞의 방법을 사용하면 상속 계층 전체의 모든 클래스에서 동일한 로거 이름(실제 클래스의 이름)을 사용할 수 있습니다.그래서 만약에Bar
확장Foo
둘 다 에 로그인합니다.Bar
로거직감적으로 보는 사람도 있습니다.
다음 블로그 투고를 확인하십시오.Java 스태틱로거 제거jcabi-log에서 slf4j를 사용하는 방법은 다음과 같습니다.
import com.jcabi.log.Logger;
class Foo {
void save(File f) {
Logger.info(this, "file %s saved successfully", f);
}
}
그리고 그 잡음은 더 이상 사용하지 마세요.
static
는 클래스의 인스턴스당1개의 로거가 아닌 클래스당1개의 로거만 작성하는 것을 의미합니다.일반적으로, 이것은 여러분이 원하는 것입니다 - 로거는 클래스에 의해서만 달라지는 경향이 있기 때문입니다.
final
이 값은 변경하지 않는다는 것을 의미합니다.logger
변수.이는 거의 항상 (1개의 클래스로부터의) 모든 로그메시지를 같은 로거에 던지기 때문입니다.클래스가 다른 로거에 메시지를 보내는 경우는 드물지만 다른 로거 변수(예: 로거 변수)를 작성하는 것이 훨씬 명확합니다.widgetDetailLogger
)는, 스태틱 변수의 값을 온플라이로 변환하는 것이 아닙니다.
필드 값은 언제 변경하시겠습니까?
값을 변경하지 않을 경우 필드 파이널을 작성하면 값을 변경하지 않을 것이 분명합니다.
일반적으로 로거를 초기화하여 클래스 이름을 사용하여 로그를 기록합니다.즉, 정적이 아닌 경우 클래스의 각 인스턴스가 해당 인스턴스의 인스턴스(메모리 사용 공간 증가)를 갖게 되지만, 이러한 로거는 모두 동일한 설정을 공유하고 동일하게 동작합니다.그게 바로 그 이유야static
비트를. 또한 각각의Logger
클래스명으로 초기화되어 서브클래스와의 경합을 방지하기 위해 선언합니다.private
유전될 수 없습니다.그final
그 이유는, 통상, 이 시스템을 변경하지 않기 때문입니다.Logger
실행 중에 (일단 초기화된 후에는 '재설정'을 하지 않습니다) 이 경우 (실수 또는 기타 실수로) 변경할 수 없도록 최종 결정을 내리는 것이 타당합니다.물론, 만약 당신이 그것을 사용할 예정이라면Logger
사용할 필요가 없는 다른 방법으로static final
--하지만 80%의 앱이 위에서 설명한 대로 로깅을 사용할 것이라고 추측합니다.
이 질문에 답하기 위해서는 "static"과 "final"이 무엇을 위한 것인지 자문해 보아야 합니다.
Logger의 경우(Log4J Logger 클래스에 대해 말하는 것으로 가정합니다) 클래스당 카테고리가 필요합니다.이렇게 하면 1회만 할당할 수 있으며 클래스당 여러 인스턴스가 필요하지 않습니다.그리고 아마도 한 클래스의 Logger 객체를 다른 클래스에 노출시킬 이유가 없을 것입니다. 그러니 이것을 비공개로 하고 몇 가지 OO-Principles를 따르는 것은 어떨까요?
또, 컴파일러는 그 메리트를 얻을 수 있습니다.따라서 코드 성능이 약간 향상됩니다.
이는 일반적으로 개체의 모든 인스턴스에서 공유할 수 있는 종류의 기능이기 때문입니다.같은 클래스의 2개의 인스턴스에 대해 다른 로거를 갖는 것은 별로 의미가 없습니다(90%).
단, 로거 클래스가 싱글톤으로 선언되거나 단순히 스태틱 기능을 제공하여 데이터를 기록할 수도 있습니다.
이 코드는 취약하지만 Java7 이후에는Logger lgr = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
스태틱 로거 대신.
대부분의 경우 참조를 변경하지 않고final
수식어가 표시됩니다.클래스 인스턴스별로 개별 인스턴스가 필요하지 않습니다.static
우선 퍼포먼스를 중시하여 최적화(최종)할 수 있고 메모리 절약(정적)이 가능합니다.
이상적으로는 Logger는 Java 7까지입니다.Sonar를 제공하지 않고 Compliance Code: private: never accessable the parent class.다른 클래스가 무언가를 기록해야 하는 경우 해당 클래스의 인스턴스(개체)에 의존하지 말고 자신의 logger.static:를 인스턴스화해야 합니다.로깅을 할 때는 물론 컨텍스트 정보를 메시지로 제공할 수 있지만 로거를 클래스레벨로 생성하여 각 오브젝트와 함께 로거를 작성하지 않도록 하고, 이로 인해 높은 메모리 용량을 확보하지 않도록 해야 합니다.final : 클래스당 한 번만 생성됩니다.
인터넷에서 읽은 로거 정적인지 아닌지에 대한 정보에 따르면 베스트 프랙티스는 사용 사례에 따라 사용하는 것입니다.
주요 인수에는 다음 두 가지가 있습니다.
1) 정적으로 하면 가비지 수집이 되지 않습니다(메모리 사용량 및 퍼포먼스).
2) 정적으로 하지 않으면 클래스 인스턴스별로 생성됩니다(메모리 사용량).
따라서 싱글톤용 로거를 작성할 때는 스태틱하게 할 필요가 없습니다.인스턴스는 1개뿐이므로 로거는 1개입니다.
한편 모델 또는 엔티티 클래스의 로거를 작성하는 경우에는 중복된 로거를 작성하지 않도록 정적으로 해야 합니다.
다른 답변에 제시된 이유와 더불어, 한 가지 우연히 알게 된 것은 로거가 정적이지도 않고 최종적이지도 않다는 것입니다.
...
public Logger logger = LoggerFactory.getLogger(DataSummary.class);
public String toJson() {
GsonBuilder gsonBuilder = new GsonBuilder();
return gsonBuilder.create().toJsonTree(this).toString();
}
...
(Gson 라이브러리를 사용하고 있을 때) stackoverflow 예외가 발생하는 경우가 있습니다.저의 구체적인 상황은 비정적 비최종 로거를 포함하는 클래스를 인스턴스화하는 것이었습니다.다음으로 Gson Builder를 호출한toJson 메서드를 호출합니다.
...
DataSummary ds = new DataSummary(data);
System.out.println(ds.toJson());
...
스태틱 로거는 스태틱컨텍스트에서 동작하도록 되어 있기 때문에 실제로는 「해롭다」라고 하는 경우가 있습니다.예를 들어 역동적인 환경을 가진 경우.OSGi를 사용하면 스태틱하지 않은 로거를 사용할 수 있습니다.일부 로깅 구현에서는 내부적으로 로거 캐시를 수행하므로(AFAIK 이상 log4j), 성능에 미치는 영향은 무시할 수 있습니다.
스태틱 로거의 한 가지 단점은 가비지 수집(초기화 중 클래스가 한 번만 사용되는 경우 로거는 계속 주위에 유지됩니다)입니다.
자세한 내용은 다음을 참조하십시오.
- http://slf4j.org/faq.html#declared_static
- https://cwiki.apache.org/confluence/display/COMMONS/Logging+StaticLog
다음 항목도 참조하십시오.
사용하고 있습니다
private - 클래스의 개인 데이터 멤버로 유지됩니다(일반적으로 모든 클래스 수준 변수에 대해 필요).
static - 이것은 중요합니다.클래스 전체에 대해 단일 로거 인스턴스가 필요하며 클래스의 모든 새로운 인스턴스/오브젝트가 새로운 로거를 생성하는 것이 아닙니다.java의 정적 키워드도 같은 의미로 작성되었습니다.따라서 정적인 상태임을 선언합니다.
final - logger 변수의 값을 변경하는 것이 아니라 전체 클래스 수명 주기 동안 일정하게 유지하기를 원합니다.
내부 정적 클래스에는 정적 로거가 여전히 필요합니다.
언급URL : https://stackoverflow.com/questions/6653520/why-do-we-declare-loggers-static-final
'programing' 카테고리의 다른 글
설정된 최하위 비트 위치 (0) | 2022.07.17 |
---|---|
size of ( )를 사용하지 않고 이 코드를 사용하여 어레이 크기를 결정하는 방법 (0) | 2022.07.17 |
vuex를 사용하는 vue/axios에서 글로벌 http 응답 오류 처리 (0) | 2022.07.17 |
C에서 파일을 잘라내는 방법 (0) | 2022.07.17 |
C/C++ 기본형은 원자형입니까? (0) | 2022.07.17 |