2009-11-20 7 views
2

클래스가 싱글 톤 패턴을 구현하는 경우 모든 변수를 정적으로 선언해야합니까?자바 싱글 톤 패턴, 모든 변수가 클래스 변수 여야합니까?

정적으로 선언하면 안되는 이유가 있습니까? 차이가 있습니까?

+1

먼저 싱글 톤 패턴을 사용하지 않는 것으로 생각하십니까? 객체 지향 프로그래밍에서 안티 패턴으로 잘 알려져 있습니다. – nandokakimoto

+4

나는 싱글 톤 패턴이 나쁜 패턴이라는 것에 결코 동의하지 않았다. '신'물체로 사용하는 것은 좋은 생각이 아니지만 그 자리가 있습니다. – paxdiablo

+0

싱글 톤이 좋은 위치에있는 곳은 거의 없습니다. 문자열 외부화는 모든 규칙 성에서 볼 수있는 유일한 것입니다. 심지어 가장 널리 사용되는 플랫폼은 현재 라이브러리 또는 언어 기능을 제공하여 해당 유스 케이스를보다 잘 캡슐화합니다. –

답변

12

아니요. 싱글 톤 패턴은 단일 인스턴스가 유일한 인스턴스라는 것을 의미하며 "모든 것을 정적으로 액세스 가능하게 만들기"를 의미하지는 않습니다.

싱글 톤 패턴은 코드를 테스트하고 리팩토링하는 기능을 희생시키지 않으면 서 "단일 인스턴스"의 모든 이점을 제공합니다.

편집 :

내가 만들려고 지점이 (상황에 따라) 기능이 소비되는 방식의 차이이며, 기능이 어떻게 초기화해야한다는 것입니다.

대부분의 경우 개체가 단일 인스턴스 (예 : 최종 생산 시스템) 만 가질 수 있습니다. 그러나 당신이 그것을 유일한 선택이되도록 강요한다면 훨씬 더 어려워지는 다른 상황 (예 : 테스트)이 있습니다.

또한 "정적 인 클래스를 만드는 것은 단지"클래스의 한 인스턴스 만 액세스 가능해야합니다 "- 일반적으로 의도 한 것보다 중요한 의미를가집니다.

또한 소프트웨어의 초기화와 객체 수명주기는 다른 사람이 제어하는 ​​경우가 많습니다. (여기서는 DI에 대해 이야기하고 있습니다.) 정적 인 것이 실제로는 도움이되지 않습니다.

+1

엄밀히 말하자면, 싱글 톤 패턴을 사용하면 인스턴스의 수를 0 개 이상으로 제한 할 수 있습니다 (지연 초기화의 경우 0). 그것이 하나가되는 것이 일반적입니다. 만약 당신이 그것을 2 개 이상으로 고정시키고 싶다면 정적으로 만드는 것이 더 어려워 질 것입니다. – TofuBeer

+0

@TofuBeer, 당신이 2 명이라면 반드시 싱글 톤이 아닐 것입니다. 그게 더블 톤이 아니겠습니까? :-) – paxdiablo

4

일반적인 싱글 톤 패턴에서는 이 아니고 통계를 사용합니다. 일반 필드를 사용하도록 클래스를 코딩하고 생성자에서 초기화 한 다음 새로운 MyClass()을 한 번 실행하여 결과를 정적 인 위치에 저장합니다.

1

고객 이어야합니다 ( 일 필요는 없음).

  • 나는 어떤 시점에서 싱글 톤 클래스와 가진 클래스 레벨에 대한 나쁜 생각이었다 결정할 수있다 : 그러나, 심지어 싱글, 나는 모든 변수가 객체 수준이 아닌 클래스 수준을하기 때문에하는 경향이 변수는 리펙토링을 어렵게 만듭니다.
  • 개체 수준 변수를 사용하면 개체를 인스턴스화 할 때만 존재하게됩니다. 클래스 수준에서는 언제나 그곳에 있습니다.

결론 : 오브젝트 레벨로 갖는 것이 단점이라고 생각하지 못했습니다. 클래스 레벨에 대한 위의 두 가지 단점은 아주 적지 만 거기에 있습니다. 아마 결국 개인적인 취향에 달려 있습니다.

+0

+1. 기술적으로 정적 필드는 항상 존재하지 않습니다. 클래스가로드 될 때 "존재하게됩니다". – ChssPly76

3

아니요, 일반적으로 정적 인 유일한 것은 싱글 톤 자체에 대한 참조입니다 (JNDI 또는 종속성 주입 컨테이너와 같은 참조도 저장하는 다른 방법이 있습니다).

필드를 정적으로 선언하지 않는 이유는 (단 하나의 패턴에서 단 하나의 인스턴스 만 필요하지만) 이는 일반적으로 싱글 톤 클래스의 다른 약간 다른 인스턴스를 생성 할 수있는 유연성을 제공한다는 것입니다. 테스팅과 같은 특별한 상황에서 그렇게 할 수 있습니다.

유연성이 필요하다고 생각하지 않는다해도 포기할 이유가 없습니다. 필드를 정적으로 선언하면 잃을 이점이 없습니다.

+0

+1 "다중 인스턴스"의 이점을 포기하지 않고 적절한 경우 단일 인스턴스 액세스를 제공합니다. 이는 모든 것을 정적으로 만들 때 발생합니다. –

0

현재 자바에서 싱글을 만드는 방법 (하나의 가능한 방법)에 읽을 수 있습니다

Wikibooks Design Patterns: Java Singleton

이 기본적으로 필요하지 않은 (도한다) 정적 클래스의 모든 일을 단지 왜냐하면 당신은 무언가를 싱글 톤으로 사용하려고하기 때문입니다. 몇 가지 이유

  • 확인 paxdiablo에서 답변 틸로가 있습니다
  • 또한 모든 정적이 그것을 당신은 또한 모든 생성자를 제거 할 필요가 싱글을하지 않습니다 수 있도록 (기본 생성자는 비공개 잊지 마세요)
+0

모든 생성자를 비공개로 만들 필요가 있는지 나는 모른다. 클래스에 다른 용도가있을 수 없다는 것을 강요하지 않으면 서 싱글 톤 패턴을 사용할 수 있습니다. 또한 공개적으로 보이는 생성자는 DI 등에서도 훌륭하게 작동합니다. – Thilo