클래스가 싱글 톤 패턴을 구현하는 경우 모든 변수를 정적으로 선언해야합니까?자바 싱글 톤 패턴, 모든 변수가 클래스 변수 여야합니까?
정적으로 선언하면 안되는 이유가 있습니까? 차이가 있습니까?
클래스가 싱글 톤 패턴을 구현하는 경우 모든 변수를 정적으로 선언해야합니까?자바 싱글 톤 패턴, 모든 변수가 클래스 변수 여야합니까?
정적으로 선언하면 안되는 이유가 있습니까? 차이가 있습니까?
아니요. 싱글 톤 패턴은 단일 인스턴스가 유일한 인스턴스라는 것을 의미하며 "모든 것을 정적으로 액세스 가능하게 만들기"를 의미하지는 않습니다.
싱글 톤 패턴은 코드를 테스트하고 리팩토링하는 기능을 희생시키지 않으면 서 "단일 인스턴스"의 모든 이점을 제공합니다.
편집 :
내가 만들려고 지점이 (상황에 따라) 기능이 소비되는 방식의 차이이며, 기능이 어떻게 초기화해야한다는 것입니다.
대부분의 경우 개체가 단일 인스턴스 (예 : 최종 생산 시스템) 만 가질 수 있습니다. 그러나 당신이 그것을 유일한 선택이되도록 강요한다면 훨씬 더 어려워지는 다른 상황 (예 : 테스트)이 있습니다.
또한 "정적 인 클래스를 만드는 것은 단지"클래스의 한 인스턴스 만 액세스 가능해야합니다 "- 일반적으로 의도 한 것보다 중요한 의미를가집니다.
또한 소프트웨어의 초기화와 객체 수명주기는 다른 사람이 제어하는 경우가 많습니다. (여기서는 DI에 대해 이야기하고 있습니다.) 정적 인 것이 실제로는 도움이되지 않습니다.
일반적인 싱글 톤 패턴에서는 이 아니고 통계를 사용합니다. 일반 필드를 사용하도록 클래스를 코딩하고 생성자에서 초기화 한 다음 새로운 MyClass()
을 한 번 실행하여 결과를 정적 인 위치에 저장합니다.
고객 이어야합니다 ( 일 필요는 없음).
결론 : 오브젝트 레벨로 갖는 것이 단점이라고 생각하지 못했습니다. 클래스 레벨에 대한 위의 두 가지 단점은 아주 적지 만 거기에 있습니다. 아마 결국 개인적인 취향에 달려 있습니다.
+1. 기술적으로 정적 필드는 항상 존재하지 않습니다. 클래스가로드 될 때 "존재하게됩니다". – ChssPly76
아니요, 일반적으로 정적 인 유일한 것은 싱글 톤 자체에 대한 참조입니다 (JNDI 또는 종속성 주입 컨테이너와 같은 참조도 저장하는 다른 방법이 있습니다).
필드를 정적으로 선언하지 않는 이유는 (단 하나의 패턴에서 단 하나의 인스턴스 만 필요하지만) 이는 일반적으로 싱글 톤 클래스의 다른 약간 다른 인스턴스를 생성 할 수있는 유연성을 제공한다는 것입니다. 테스팅과 같은 특별한 상황에서 그렇게 할 수 있습니다.
유연성이 필요하다고 생각하지 않는다해도 포기할 이유가 없습니다. 필드를 정적으로 선언하면 잃을 이점이 없습니다.
+1 "다중 인스턴스"의 이점을 포기하지 않고 적절한 경우 단일 인스턴스 액세스를 제공합니다. 이는 모든 것을 정적으로 만들 때 발생합니다. –
현재 자바에서 싱글을 만드는 방법 (하나의 가능한 방법)에 읽을 수 있습니다
Wikibooks Design Patterns: Java Singleton
이 기본적으로 필요하지 않은 (도한다) 정적 클래스의 모든 일을 단지 왜냐하면 당신은 무언가를 싱글 톤으로 사용하려고하기 때문입니다. 몇 가지 이유
모든 생성자를 비공개로 만들 필요가 있는지 나는 모른다. 클래스에 다른 용도가있을 수 없다는 것을 강요하지 않으면 서 싱글 톤 패턴을 사용할 수 있습니다. 또한 공개적으로 보이는 생성자는 DI 등에서도 훌륭하게 작동합니다. – Thilo
먼저 싱글 톤 패턴을 사용하지 않는 것으로 생각하십니까? 객체 지향 프로그래밍에서 안티 패턴으로 잘 알려져 있습니다. – nandokakimoto
나는 싱글 톤 패턴이 나쁜 패턴이라는 것에 결코 동의하지 않았다. '신'물체로 사용하는 것은 좋은 생각이 아니지만 그 자리가 있습니다. – paxdiablo
싱글 톤이 좋은 위치에있는 곳은 거의 없습니다. 문자열 외부화는 모든 규칙 성에서 볼 수있는 유일한 것입니다. 심지어 가장 널리 사용되는 플랫폼은 현재 라이브러리 또는 언어 기능을 제공하여 해당 유스 케이스를보다 잘 캡슐화합니다. –