문제

저는 CVS 브랜치를 병합하고 있으며 더 큰 변경 사항 중 하나는 정적 초기화 블록과 모든 정적 메서드가있는 추상 클래스로 Singleton 패턴이 발생할 때마다 교체하는 것입니다.

많은 충돌을 병합해야하므로 유지해야 할 가치가 있습니까?이 리팩토링이 가치가 있으려면 어떤 상황을 살펴 봐야합니까?

이 앱은 Weblogic 8.1 (JDK 1.4.2)에서 실행 중입니다. <시간>

토마스 죄송합니다. 명확히하겠습니다 ..

HEAD 버전에는 전통적인 싱글 톤 패턴 (개인 생성자, getInstance () 등)이 있습니다.

분기 버전에는 생성자가없고 '공개 추상 클래스'이며 개체의 모든 메서드가 '정적'으로 수정되었습니다.개인 생성자에 있던 코드는 정적 블록으로 이동됩니다.

그런 다음 클래스의 모든 사용이 변경되어 병합시 여러 충돌이 발생합니다.

이 변경 사항이 몇 가지 있습니다.

도움이 되었습니까?

해결책

엄격한 런타임 성능 관점에서 볼 때 그 차이는 매우 미미합니다.둘 사이의 주요 차이점은 "정적"라이프 사이클이 클래스 로더에 연결되어 있다는 사실에 있습니다. 반면 싱글 톤의 경우 일반 인스턴스 라이프 사이클입니다.일반적으로 ClassLoader 비즈니스를 멀리하는 것이 좋습니다. 특히 웹 애플리케이션을 다시로드하려고 할 때 까다로운 문제를 피할 수 있습니다.

다른 팁

상태를 저장해야하는 경우 싱글 톤을 사용하고 그렇지 않으면 정적 클래스를 사용합니다.무언가를 저장할 필요가 없다면 단일 인스턴스라도 인스턴스화 할 필요가 없습니다.

Static은 확장성에 좋지 않습니다. 정적 메서드와 필드는 하위 클래스에 의해 확장되거나 재정의 될 수 없기 때문입니다.

단위 테스트에도 좋지 않습니다.단위 테스트 내에서 클래스 로더를 제어 할 수 없기 때문에 다른 테스트의 부작용이 넘치지 않도록 할 수 없습니다.한 단위 테스트에서 초기화 된 정적 필드가 다른 단위 테스트에서 표시되거나 더 나쁜 경우 동시에 테스트를 실행하면 예측할 수없는 결과가 생성됩니다.

싱글 톤은 드물게 사용하면 일반적으로 괜찮은 패턴입니다.저는 DI 프레임 워크를 사용하는 것을 선호하며 저를 위해 인스턴스를 관리하도록합니다 (Guice에서와 같이 다른 범위 내에서 가능).

내 원래 게시물이 올바른 이해이고 링크 된 Sun의 토론이 정확하다면 (내 생각에) 명확성과 성능 사이에서 균형을 맞춰야한다고 생각합니다.

다음 질문을 스스로에게하십시오.

  1. 싱글 톤 객체가 내가하는 일을 더 명확하게 해주나요?
  2. 이 작업을 수행하려면 객체가 필요합니까 아니면 정적 메서드에 더 적합합니까?
  3. 싱글 톤을 사용하지 않음으로써 얻을 수있는 성능이 필요합니까?

내 경험에 비추어 볼 때 중요한 것은 단위 테스트에서 어느 것이 더 쉽게 조롱 할 수 있는지입니다.나는 항상 Singleton이 더 쉽고 자연스럽게 조롱한다고 느꼈습니다.조직에서 JMockit을 사용할 수 있다면 이러한 문제를 극복 할 수 있으므로 문제가되지 않습니다.

이 토론이 도움이 되었습니까?(다른 프로그래밍 포럼에 링크하는 것이 금기인지는 모르겠지만 전체 토론을 인용하는 것이 아니라=))

이 주제에 대한 Sun 토론

기술적으로는 정적 방법이 더 효율적이지만 대부분의 경우 문제에 대한 충분한 차이를 만들지 못한다는 평결이 있습니다.

성능을 측정하는 코드를 작성하십시오.대답은 JVM (Sun의 JDK가 JRockit과 다르게 수행 될 수 있음)과 애플리케이션이 사용하는 VM 플래그에 따라 달라집니다.

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