문제

이것이 중복되거나 너무 기본적이라면 미안하지만 서브 클래스를 만들 수있는 싱글 톤 클래스를 어떻게 만들려면 어떻게해야합니까?

도움이 되었습니까?

해결책

Steve Yegge는 재미가 있습니다 기사 이 인용문에서 서브 클래스를 언급하는 싱글 톤에 대해 :

그런 다음 서브 클래스가 있습니다. 싱글 톤을 서브 클래스하는 것은 거의 불가능하며, 관리한다면 처음부터 싱글 톤을 사용해서는 안됩니다. 당신은 그렇지 않습니다 조차 거기에 가고 싶어. 나는 감히 이야기하지 않는 길을 걸었다. 당신이 할 수 없다고 척하면, 당신은 놀라운 양의 고통을 구할 것입니다.

다른 팁

당신은 일반적으로 유용한 의미에서 할 수 없습니다. 이것은 싱글 톤 수업을 사용하지 않는 또 다른 이유입니다.

사실, 나는 그것이 가능하다고 생각하지 않습니다.

당신은 생성자를 선언하여 클래스 싱글 톤을 만듭니다. private. 그러나 싱글 톤 클래스의 서브 클래스를 선언하려고하면 서브 클래스 생성자는 슈퍼 클래스의 생성자를 볼 수 없으므로 컴파일하지 않습니다. 예를 들어

public class A () {
    private A() { }
}

public class B () {
    private B() { }
}

SUN JDK 1.6 및 Eclipse Ganymede 컴파일러는 모두 생성자 B에 컴파일 오류를 제공하며, A에 대한 NO-ARGS 생성자가 보이지 않는 효과.

당신은 가시성을 높일 수 있습니다 private 생성자이지만, 누군가가 여러 인스턴스를 만들지 못하게하는 것은 없습니다. 다시 말해서, 그것은 더 이상 싱글 톤 수업이 아닙니다.

편집 : 코셔 대안은 일반적으로 원하는 방법 / 멤버로 하나 이상의 초록 (비 싱턴) 클래스의 트리를 정의 한 다음 여러 싱글 톤 클래스를 잎 클래스로 정의하는 것입니다. 그러나 그것은 하나의 싱글 톤 클래스가 다른 것을 서브 클래스하는 것이 아닙니다.

싱글 톤을 다음과 같이 정의한 경우 :

public class Singleton {
  private static Singleton instance;
  public static Singleton getInstance() {
     if (instance == null) {
       instance = new Singleton();
     }
     return instance;
  }
  private Singleton() {
  }
}

그럼 당신은 그냥 할 수 있습니다 :

public class NewSingleton extends Singleton {
}

그러나 개인 방법을 사용할 수 없으므로 싱글 톤을 사용하려면 여전히 전화해야합니다. Singleton.getInstance(); 그래서 당신은 그것을 확장하여 아무것도 얻지 못합니다.

그러나 당신이 할 수없는 이유는 없습니다.

이제 싱글 톤 클래스에 더 많은 기능을 추가하려면 Songleton에서 유형 간 측면을 사용하여 싱글 톤에 새로운 방법/속성을 주입하여 싱글 톤에서 사용할 수 있습니다.

싱글 톤은 상속이 아닌 인스턴스를 제한합니다. 글쎄 - 이미 지적했듯이, 그것은 상속의 유용성을 제한 한 다음 개인 생성자를 완화하여 포장 또는 보호를받을 수 있지만 (싱글 톤의 싱글토 니스를 줄일 수 있음) 목적은 무엇입니까?

다른 사람들이 이미 대답했듯이, 싱글 톤 서브 클래스의 사용은 작습니다. 싱글 톤의 맥락에서 전략 패턴이 필요한 경우 인터페이스를 정의하고 싱글 톤 인스턴스에서 해당 인터페이스 구현을 위임 할 수 있습니다. 이것은 문제를 하나의 층 아래로 움직이고 왜 그렇게하고 싶은지 더 명확하게 만듭니다.

귀하의 질문에 답하기 위해; 응용 프로그램이 사용하는 특정 서브 클래스에 대한 선택이 예를 들어 시스템 속성에 정의되어 있다고 가정하면 다음과 같은 작업을 수행 할 수 있습니다.

public static synchronised Singleton getInstance() {
    if (instance == null) {
        String clsName = System.getProperties().getProperty("singleton.class");
        if (className == null || 0 == clasName.length()) {
            instance = new Singleton();
        } else {
            Class cls = Class.forName(clsName);
            instance = (Singleton) cls.newInstance();
        }
     }
     return instance;
}

면책 조항 : 테스트되지 않은 코드, 예외 처리 등 추가 등 :-) BTW, getInstance() 메소드는 동기화됩니다.

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