2008-08-26 6 views
15

CVS 분기를 병합 중입니다. 더 큰 변경 중 하나는 정적 초기화 블록과 모든 정적 메서드가있는 추상 클래스가있는 Singleton 패턴이있는 곳에서 대체됩니다.Java Singleton 대 정적 - 실제 성능 이점이 있습니까?

많은 충돌을 병합해야하므로이 리팩토링을 가치있게 생각하면 어떤 상황입니까?

우리는

머리 버전의 전통적인 싱글 톤 패턴 (개인 생성자가 ..


미안 토마스, 내가 명확하게 웹 로직 8.1 (그래서 JDK 1.4.2)

에서이 응용 프로그램을 실행하는

분기 버전에는 생성자가없고 'public abstract class'이며 객체의 모든 메소드가 '정적'으로 수정되었습니다. 개인 생성자에 존재했던 코드는 정적 블록으로 옮겨집니다.

그러면 모든 병합 사용이 변경되어 병합에 여러 충돌이 발생합니다.

이 변경 사항이 적용된 경우가 있습니다.

답변

15

엄격한 런타임 성능 관점에서 볼 때 그 차이는 실제로 무시해도 좋습니다. 이 둘의 주요 차이점은 "정적"수명주기가 클래스 로더에 연결되어있는 반면, 단일 기능의 경우에는주기적인 인스턴스 수명주기라는 사실에 있습니다. 일반적으로 ClassLoader 비즈니스에서 멀리 떨어져있는 것이 더 좋으며, 특히 웹 응용 프로그램을 다시로드하려고 할 때 까다로운 문제를 피하십시오.

+1

싱글 톤은 정적 인 것처럼로드 한 클래스 로더의 ClassLoader 수명에 종속되어 있습니다. –

+5

그리고? 모든 것은 ClassLoader의 수명과 관련되어 있지만, 싱글 톤을 사용하면 추가 라이프 사이클 레이어를 얻을 수 있으며, 상황을 적절히 처리 할 수있는 기회가 더 많습니다. –

0

이 토론이 도움이됩니까?

Sun Discussion on this subject

평결은하지 않는 것 같다) (= 또 다른 프로그래밍 포럼에 링크 금기인지는 모르겠지만, 차라리 그냥 전체 토론을 인용하지 않는 게 좋을) 기술적으로 정적 인 방법이 더 효율적 임에도 불구하고 대부분의 경우에 차이가 있습니다.

3

내 원래 게시물이 올바른 이해이고 링크 된 Sun의 논의가 정확하다면 (나는 생각할 수도 있음), 선명도와 성능 사이의 균형을 유지해야한다고 생각합니다.

  1. 는 Singleton 객체가 좀 더 명확 뭘하는지 지나요 :

    자신에게 이런 질문을?

  2. 이 작업을 수행하는 데 개체가 필요하거나 정적 방법에 더 적합합니까?
  3. 싱글턴을 사용하지 않으면 얻을 수있는 성능이 필요합니까?
+0

질문은 실제로 성능 향상에 관한 것입니다 .-) 초당 100 건의 요청을 처리하는 컨트롤러가 있다고 가정 해보십시오. 이것은 상태없는 서비스로서 싱글 톤 또는 클래스 중 하나를 선택하는 것과 관련이 있습니까? – lisak

16

모든 상태를 저장해야하는 경우에는 싱글 톤을 사용하고 그렇지 않은 경우 정적 클래스를 사용합니다. 무언가를 저장할 필요가 없다면 무언가를 인스턴스화 할 필요가 없습니다. 인스턴스가 하나 인 경우에도 마찬가지입니다.

3

나의 경험에서 중요한 것은 단위 테스트에서 조롱하기 쉬운 것이 무엇인지뿐입니다. 나는 항상 싱글 톤이 조롱하기가 더 쉽고 자연 스럽다고 느꼈다.조직에서 JMockit을 사용할 수있게하는 경우 이러한 우려를 극복 할 수 있으므로 문제가되지 않습니다.

11

정적 메서드 및 필드는 하위 클래스로 확장하거나 재정의 할 수 없으므로 정적 속성은 확장성에 좋지 않습니다.

단위 테스트에도 좋지 않습니다. 유닛 테스트에서는 클래스 로더를 제어 할 수 없기 때문에 다른 테스트의 부작용을 넘치지 않게 할 수 있습니다. 한 단위 테스트에서 초기화 된 정적 필드는 다른 단위 테스트에서 볼 수 있거나 더 나 빠지면서 동시에 테스트를 실행하면 예기치 않은 결과가 발생합니다.

자주 사용하는 경우 싱글 톤은 일반적으로 ok 패턴입니다. DI 프레임 워크를 사용하여 저의 인스턴스를 관리하게하는 것이 더 좋습니다 (Guice의 경우와 다를 수 있습니다).

0

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

관련 문제