2009-10-22 2 views
5

중복되거나 너무 초등의 경우 유감이지만 하위 클래스로 만들 수있는 싱글 톤 클래스를 만들려면 어떻게해야합니까?다른 클래스를 싱글 톤 클래스에서 파생시키는 방법은 무엇입니까?

+1

왜 downvote? 이것은 합법적 인 질문처럼 보입니까? –

+1

아마 downvoter는 최근에 저녁 식사를 먹었고 현재 sated 느낌 때문에 "alimentary"참조는 매력적이지 않다고 느꼈습니다 ...? –

+0

죄송합니다. @Alex. 네가 그걸 게시 할 때 네 농담을 망쳤다. –

답변

11

스티브 예그는이이 인용에서 서브 클래 싱 언급한다 싱글에 대한 재미있는 article :

그런 다음 서브 클래스 일이있다. 그것은 싱글 서브 클래스 거의 불가능하고, 당신이 그것을 관리하는 경우, 당신은 처음에 싱글을 사용하고 안 . 너 하지 말자 가고 싶다. 나는 걸어 다니는 길을 막지 못했다. 그냥 할 수있는 척하지 말고 당신은 고통의 놀라운 금액을 자신을 저장합니다.

+0

그래서 대답은 "아니오"입니까? – unj2

+1

그런 식으로 읽고 싶다면, 그렇습니다. 또는 그것을 읽고 대답이 '예'라고 생각할 수 있지만 여전히 시도하면 안됩니다. 처음에 싱글 톤을 사용하는 이유를 평가할 수 있습니다. –

5

당신이 일반적으로 할 수없는, 어떤 유용한 의미한다. 이것은 싱글 톤 클래스를 사용하지 않는 또 다른 이유입니다. 당신이 단지 수 그리고

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

:

1
당신이 당신의 싱글을 정의한 경우

public class NewSingleton extends Singleton { 
} 

을하지만, 당신은 당신이 원하는, 그래서 만약 민간 방법을 사용할 수 없습니다 싱글 톤을 사용하면 여전히 Singleton.getInstance();으로 전화해야하므로 아무 것도 얻지 못합니다.

는하지만, 당신이 그것을 할 수없는 이유를 이유가 없다.

이제 Singleton 클래스에 더 많은 함수를 추가하려면 AspectJ의 inter-type aspect를 사용할 수 있고 새로운 메소드/속성을 Singleton에 삽입하면 Singleton에서 사용할 수 있습니다.

1

싱글 톤은 상속이 아닌 인스턴스를 제한합니다. 글쎄 - 이미 지적했듯이 상속의 유용성을 제한하고 패키지 또는 보호하기 위해 개인 생성자를 완화 할 수 있습니다 (단 하나의 싱글 톤을 감소한다고 주장 할 수도 있음)하지만 목적은 무엇입니까?

3

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

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

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

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

썬 JDK 1.6와 이클립스 가니메데 컴파일러는 모두 A의 인자없는 생성자가 보이지 않는 효과로, 생성자 B에 컴파일 오류를 제공합니다. 그것의 여러 인스턴스를 만들 수있는 사람을 중지

당신은 private 생성자의 가시성을 증가시킬 수 있지만, 다음 (좋은 의미에서 떨어져) 아무것도 없다. 다시 말해 그것은 실제로 싱글 톤 클래스가 아닙니다.

편집 : 당신이 공통으로하고 싶은 메소드/멤버를 사용하여 하나 이상의 추상 (비 - 싱글 톤) 클래스의 트리를 정의한 다음 리프 클래스로 여러 싱글 톤 클래스를 정의하는 것이 더 좋을 것입니다. 적절한. 그러나 그것은 하나의 싱글 톤 클래스가 다른 클래스를 하위 클래스 화하는 것이 아닙니다.

+0

그것은 컴파일 ... 나는 2 개의 테스트 수업을 만드는 데 시간을 허비 할만큼 충분히 바보입니다. 그래서 (최소 - 인수 생성자 없음) – Bostone

+0

오우락 - '낭비'는 – Bostone

+0

무엇을 가축과 관련이 있습니까 ??? :-) –

0

다른 사람들이 이미 대답 했으므로 싱글 톤 서브 클래 싱의 용도는 작습니다. 싱글 톤 컨텍스트에서 전략 패턴이 필요한 경우 싱글 톤 인스턴스에서 인터페이스를 정의하고 해당 인터페이스 구현에 위임 할 수 있습니다. 이렇게하면 한 층 아래로 문제가 옮겨지고 왜 그렇게하고 싶은지 명확하게 알 수 있습니다.

질문에 답변하십시오; , 테스트되지 않은 코드 :-) 가, BTW 확인 등 예외 처리를 추가 :

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; 
} 

면책 조항 : 응용 프로그램이 인스턴스에 대한 시스템 속성에 정의되어 사용하는 특정 서브 클래스에 대한 검색을 가정, 당신은 뭔가를 할 수 있습니다 getInstance() 메서드가 동기화되었습니다.

관련 문제