2009-05-27 3 views
2

C++에서는 템플릿을 사용하여 싱글 톤 기본 클래스를 만들 수 있다는 것을 알고 있습니다. 이것은 Andrei Alexandrescu가 저술 한 Modern C++ Design의 책에 설명되어 있습니다.Java의 일반화 된 싱글 톤 기본 클래스

Java에서 이처럼 될 수 있습니까?

+1

왜 그렇게하고 싶습니까? 싱글 톤은 기본적으로 안티 패턴입니다. –

+1

한 가지 이유는 알 수없는 클래스의 인스턴스를 인스턴스화하는 방법을 찾으려는 이유 중 하나 일 수 있습니다. 다른 말로하면, 클래스를 매개 변수로 주어진 다음과 같이하십시오 : Object instance = clazz instanceof Singleton? (싱글 톤) clazz.getInstance() : 새로운 clazz(); (매개 변수없는 생성자를 사용할 수 있어야하지만 물론 다른 문제입니다.) – n3rd

+3

@Elvian : 모든 것과 마찬가지로, Singleton은 좋을 때는 좋고 그렇지 않을 때는 그렇지 않습니다. 좋은 프로그래머라는 것은 패턴과 기존 솔루션을 적용하지 않을시기를 언제나 알기에 문제가 맞지 않을 때입니다. 즉, 제대로 적용해야하는지 알 수없는 경우 Singleton의 잘못이 아닙니다. – Welbog

답변

3

아직 Java에서 만족스러운 해결책을 찾지 못했습니다. C++에서 템플릿을 사용하거나 .NET에서 제네릭을 사용하는 예제가 많이 있지만 Java의 제네릭 구현에는 정적 멤버에 대한 몇 가지 제한 사항이 있습니다.

내가 본 최고의 옵션은 정적 HashMap 및 팩토리 클래스를 사용하는 것입니다. 이렇게하면 모든 클래스의 여러 싱글 톤을 제공 할 수있는 단일 팩토리를 만들 수 있습니다.

구현의 경우 this post을 참조하십시오.

+0

(또는 다른 사람) : "이 게시물"은 더 이상 최신이 아닙니다. 그 링크가 정말로 필요합니다. : -/ – AudioDroid

2

예, 모든 접근법에는 결함이 있습니다. 그들은 비싸거나 (synchronized을 사용) 시험을 불가능하게합니다 (final static).

은 오른쪽에있는 링크를 참조하십시오 :

"예술의 국가는"컨테이너를 사용하는 것 또는 공장 c 필요에 따라 싱글 톤을 reates하고 일종의 캐시에 보관합니다. Spring, Guice 등을 참조하십시오.

3

Java의 제네릭이 구체화되지 않았기 때문에 동일한 방식으로 일반화 된 Singleton을 구현할 수 없습니다. 제네릭 형식은 컴파일 된 코드에서 "지워"지기 때문에 런타임에 명시 적으로 Singleton을 초기화해야합니다.

결론은 싱글 톤 템플릿이 Java에서 많은 가치를 제공하지 않는다는 것입니다.

+0

제네릭이 구체화 된 경우에도 언어에 대한 수정 없이는 작동하지 않습니다. 예를 들어, 통계는 여전히 같은 클래스의 모든 매개 변수화에 의해 공유됩니다. –

+0

제네릭을 구체화하면 클래스 멤버 변수를 찾기 위해 실제 유형을 반영한 구현을 구상 할 수 있습니다. 나는 추측 할 수도 있지만, 나는 추측 할 때 메타 선을 그려야한다고 생각한다. – erickson

1

1997 년 JDK 1.0.2에서 이것을 시도하고 상속 가능한 싱글 톤을 만들 수 없다는 결론에 도달했습니다. 지금까지 자바는 새로운 기능을 추가하지 못했다고 말할 수있다.

그러나이 작업을 수동으로 수행하면 많은 상용구 코드가 필요하지 않으며 클래스 당 10 줄 정도가 소요될 수 있습니다. 일종의 익명의 팩토리 메커니즘을 만들 필요가 있다면, 싱글 톤은 인스턴스화 프로토콜을위한 자리 표시 자와의 인터페이스를 구현할 수 있습니다.

+0

좋은 싱글 톤은 3 줄의 코드입니다. 클래스 선언, 인스턴스 선언과 초기화, 그리고 개인 생성자. – erickson