인터뷰에서이 질문을 받았습니다. 기본 클래스 (클래스 A
)와 두 개의 서브 클래스 B
및 C
이 있습니다. 이제는 B와 C의 생성자를 제어 할 수 없습니다 (해당 생성자는 비공개가 아니며 공개되어야합니다). 그러나 필요한 경우 B
및 C
의 모든 인스턴스는 단일 바이트이어야합니다. 이것을 어떻게 할 수 있습니까? 당신이 그것을 할 Double checked locking
및 synchronized on method
를 사용할 수 있지만어떻게 파생 클래스의 싱글 톤을 만들 수 있습니까?
답변
A
에 대한 생성자에서이 작업을 수행한다고 생각합니다. 그것을 this.getClass()
으로 호출하고 그것을 사용하여 개인 HashSet에서 조회를 수행하십시오. 히트를 얻으면 이전에 클래스의 인스턴스가 만들어져 예외가 발생합니다.
public abstract class A {
private static HashSet<Class<?>> classes = new HashSet<Class<?>>();
public A() {
synchronized (classes) {
Class<?> c = this.getClass();
if (classes.contains(c)) {
throw NotSingletonException("Class " + c + " is not singleton");
}
classes.add(c);
}
}
}
A의 모든 생성자가 이렇게 정렬하면 하위 클래스가 검사를 피할 수 없습니다. JLS에서는 this()
또는 super()
호출을 try/catch 할 수 없으므로 예외가 발생하면 서브 클래스의 생성자를 정상적으로 반환 할 수 없습니다.
나는 이것이 매우 어려운 면접 질문이라고 말하고 싶지만 ...
@emory 코멘트 :
B와 C는 최종 무엇을하지 않은 경우? 그러면 B1, B2, C1, C2 등의 클래스를 생성 할 수 있습니다.
여기에서 문제가되는 것은 B1과 B2 인스턴스가 B 인스턴스이기 때문에 B 인스턴스는 더 이상 싱글 톤이 아닙니다 ... 구현하고자하는 싱글 톤의 정의에 따라 다릅니다. 당신은 반사적 클래스가 최종 경우 서브 클래스 수정보고 테스트하고 final이 아닌 클래스의 인스턴스를 생성하는 것을 거부 할 수
... :
나는이 다루는 몇 가지 방법을 볼 수 있습니다 단지를 위해.
HashSet<Class>
을List<Class>
으로 바꿀 수 있습니다. 그런 다음A
생성자가 호출 될 때마다 각 요소 클래스에 대해elem.isAssignableFrom(c)
을 호출하는 목록을 반복합니다. 어떤 호출이 true를 반환하면 (엄격한) 싱글 톤 불변 값이 위반되므로 예외가 throw되어야합니다.
논리는 싱글 - 다움이 시행하려고하는 모델에 따라 조정해야 할 수도 있습니다,하지만 일반적인 솔루션이 적용 클래스를 기록하고 검토 이전/사람과 새로운 클래스를 비교한다.
B와 C가 최종이 아닌 경우 어떻게해야합니까? 그런 다음 B1, B2, C1, C2 등의 클래스를 만들 수 있습니다. 문제가있는 경우 문제를 해결할 수있는 방법은 'c'가 A가 될 때까지 'c'의 수퍼 클래스를 연속적으로 추가하는 것입니다. – emory
내가 클래스 B
을 위해 그것을 보여주는 있어요 ... 난 ... 당신에게 그 일의 신속하고 더러운 방법을 보여주는하고
public class B {
private static B b = new B();
private B() {}
public static B getInstance() {
return b;
}
}
수정 된 질문보기 B의 생성자는 private 일 수 없습니다. – Geek
- 1. 내 싱글 톤을 개선 할 수 있습니까?
- 2. 싱글 톤을 취소 할 수 있습니까?
- 3. 이것이 싱글 톤을 어떻게 강요합니까?
- 4. 싱글 톤을 ivar로 저장해야합니까?
- 5. 싱글 톤을 대체하기 위해 프록시 패턴을 어떻게 사용할 수 있습니까?
- 6. DooPHP에서 싱글 톤을 어떻게 자동로드 할 수 있습니까?
- 7. iOS : ARC에서 싱글 톤을 어떻게 없앨 수 있습니까? 해야합니까?
- 8. 싱글 톤을 무엇으로 바꾸시겠습니까?
- 9. 싱글 톤을 사용하는 OnSaveInstanceState
- 10. 싱글 톤을 파괴하고 재구성 iOS
- 11. 싱글 톤을 사용하여 보관하기
- 12. 싱글 톤을 언제 사용합니까?
- 13. 어떻게 유닛이 obj-c에서 싱글 톤을 테스트합니까?
- 14. 싱글 톤을 언제 사용합니까?
- 15. 서블릿의 싱글 톤을 저장할 위치는 어디입니까?
- 16. 싱글 톤을 사용하여 변수 공유하기
- 17. 파이썬 싱글 톤을 멀티 프로세싱으로 변환
- 18. 유닛 테스트에서 싱글 톤을 어떻게 분리합니까?
- 19. PHP4에서 싱글 톤을 만드는 방법은 무엇입니까?
- 20. Node.js 모듈 캐싱을 사용하여 전역 적으로 액세스 할 수있는 싱글 톤을 만들 수 있습니까?
- 21. 기존 싱글 톤을 ARC로 업그레이드
- 22. 자바에서 서브 클래스로 싱글 톤을 가질 수 있습니까?
- 23. 싱글 톤을 사용하여 내 WCF 서비스를 확장 할 수 있습니까?
- 24. 데이터 관리자 클래스로 싱글 톤을 사용하고 있습니까?
- 25. Guice : 같은 클래스의 주석이있는 싱글 톤을 다른 인스턴스에 바인딩하려면 어떻게해야합니까?
- 26. PHP에서 싱글 톤을 만들려면 어떻게해야합니까?
- 27. ASP.NET에서 웹 서비스 참조를 처리해야합니까? 싱글 톤을 사용할 수 있습니까?
- 28. 싱글 톤을 초기화하는 방법은 무엇입니까?
- 29. 싱글 톤을 참조하는 방법은 무엇입니까?
- 30. 출시시 싱글 톤을 자동으로 인스턴스화합니다.
통제가 없다는 것은 무엇을 의미합니까? 코드를 변경할 수 없습니다 (필요하지 않음)? 또는 가시성을 변경할 수 없습니까? – Vitaliy
'생성자에 대한 제어권 없음'을 정의 할 수 있습니까? –