2011-06-10 3 views
8

나는 싱글 톤 클래스 집합을 가지고 있으며, 상용구 코드를 피하고 싶다. 여기에 내가 지금 무엇을 가지고 :상속을 가진 Java 싱글 톤

public class Mammal { 
    protected Mammal() {} 
} 

public class Cat extends Mammal { 
    static protected Cat instance = null; 
    static public Cat getInstance() { 
     if (null == instance) { 
      instance = new Cat(); 
     } 
     return instance; 
    } 

    private Cat() { 
     // something cat-specific 
    } 
} 

이 작동하고 잘못된 것은 내가 getInstance() 방법을 복제해야합니다 Mammal의 많은 서브 클래스를 가지고 있다는 것을 제외하고는, 없다. 가능한 경우 다음과 같은 것을 선호합니다.

public class Mammal { 
    protected Mammal() {} 

    static protected Mammal instance = null; 

    static public Mammal getInstance() { 
     if (null == instance) { 
      instance = new Mammal(); 
     } 
     return instance; 
    } 
} 

public class Cat extends Mammal { 
    private Cat() { 
     // something cat-specific 
    } 
} 

어떻게하면됩니까?

+1

귀하의 싱글 톤의 getInstance() 메소드가 제대로 구현되지 않습니다 - 당신이 할 수있는 다중 스레드 환경에서 최종적으로 여러 개의 인스턴스가 생성됩니다! – Liv

+1

질문에 대한 답변이 아니지만 귀하의 싱글 톤 패턴은 스레드로부터 안전하지 않습니다. [Java Concurrency in Practice] (http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601)에 예제가 있습니다. – Bruno

+0

여기서 싱글 톤이 가장 좋은 방법입니까? 싱글 톤은 실제 세계에서 단 하나의 인스턴스 만 존재하는 서비스 또는 다른 것들을 표현하는 데 가장 잘 사용됩니다. 코드가 실제로 고양이와 개를 사용하지 않는다고 가정하므로이 패턴이 응용 프로그램 도메인에 실제로 적합한 지 확인하십시오. 싱글 톤이 적절한 경우 Jim Garrison의 Spring 사용 솔루션을 사용하는 것이 좋습니다. 스프링 빈은 기본적으로 싱글 톤입니다. –

답변

3

생성자가 상속되거나 대체 할 수 없으므로이 작업을 수행 할 수 없습니다. 원하는 예제의 new Mammal()은 서브 클래스 중 하나가 아닌 Mammal 만 작성합니다. Factory 패턴을 살펴 보시거나, Spring과 같은 곳으로 가시기를 권장합니다.

2

enum을 사용하여 싱글 톤을 생성 할 수 있습니다.

public enum Mammal { 
    Cat { 
     // put custom fields and methods here 
    } 
} 
0

생성자를 비공개로 설정하면 클래스가 다른 클래스에 상속되지 않습니다. .

또는 싱글을 만들 수있는 가장 좋은 방법은 (조쉬 블록) 하나 열거와 클래스 열거를 만드는 것입니다