헬퍼 / 유틸리티 클래스에 대한 다음과 같은 간단한 질문에 대한 좋은 답변을 찾지 못했습니다.
정적 메서드를 사용하는 대신 싱글 톤 (상태 비 저장)을 만드는 이유는 무엇입니까?
개체에 상태가없는 경우 개체 인스턴스가 필요한 이유는 무엇입니까?
헬퍼 / 유틸리티 클래스에 대한 다음과 같은 간단한 질문에 대한 좋은 답변을 찾지 못했습니다.
정적 메서드를 사용하는 대신 싱글 톤 (상태 비 저장)을 만드는 이유는 무엇입니까?
개체에 상태가없는 경우 개체 인스턴스가 필요한 이유는 무엇입니까?
답변:
종종 싱글 톤은 애플리케이션에 일종의 전역 상태 를 도입하는 데 사용됩니다 . (정직하게 말하면 실제로 필요한 것보다 더 자주 있지만, 그것은 다른 시간에 대한 주제입니다.)
그러나 상태 비 저장 싱글 톤도 유용 할 수 있는 몇 가지 코너 케이스 가 있습니다.
lock
synchronized
Toolkit.getDefaultToolkit()
Java 의 메소드는 정확한 유형이 시스템에 따라 달라지는 싱글 톤을 반환합니다.DBNull.Value
정적 메서드 클래스 대신에 Stateless 싱글 톤이 사용되는 경우, 즉 Dependency Injection 의 경우를 볼 수 있습니다 .
직접 사용하는 유틸리티 함수의 도우미 클래스가있는 경우 숨겨진 종속성이 생성됩니다. 누가 또는 어디서 사용할 수 있는지 제어 할 수 없습니다. 상태 비 저장 싱글 톤 인스턴스를 통해 동일한 도우미 클래스를 주입하면 사용 위치와 방법을 제어하고 필요할 때 대체 / 모의 작업 등을 수행 할 수 있습니다.
싱글 톤 인스턴스로 만드는 것은 단순히 필요한 것보다 더 많은 유형의 객체를 할당하지 않도록 보장합니다 (하나만 필요하기 때문에).
실제로 여기에 언급되지 않은 또 다른 대답을 찾았습니다. 정적 메서드는 테스트하기가 더 어렵습니다.
대부분의 테스트 프레임 워크는 인스턴스 메서드를 모의하는 데 훌륭하게 작동하지만 대부분은 정적 메서드의 모의를 적절한 방식으로 처리하지 않습니다.
대부분의 프로그래밍 언어에서 클래스는 많은 유형 시스템을 피합니다. 정적 메서드와 변수가있는 클래스는 객체이지만 인터페이스를 구현하거나 다른 클래스를 확장 할 수없는 경우가 많습니다. 따라서 다른 유형의 하위 유형이 될 수 없기 때문에 다형성 방식으로 사용할 수 없습니다. 당신이 인터페이스가있는 경우 예를 들어, IFooable
다른 클래스의 여러 방법 서명에 필요한, 클래스 객체 StaticFoo
대신에 사용할 수없는 IFooable
반면, FooSingleton.getInstance()
캔 (가정 FooSingleton
구현을 IFooable
).
Heinzi의 답변에 대해 언급했듯이 싱글 톤은 인스턴스화를 제어하는 패턴입니다. 이는 작성자에게 인스턴스에 대한 더 많은 제어 권한 을 부여하는로 대체 new Class()
되며 Class.getInstance()
, Class
불필요한 인스턴스 생성을 방지하는 데 사용할 수 있습니다. 싱글 톤은 팩토리 패턴의 매우 특별한 경우이므로 그렇게 처리해야합니다. 일반적으로 사용하면 글로벌 레지스트리를 사용하면 안되는 경우가 많기 때문에 글로벌 레지스트리의 특수한 경우가됩니다.
전역 도우미 함수를 제공하려는 경우 정적 메서드가 제대로 작동합니다. 클래스는 클래스가 아니라 네임 스페이스 역할을합니다. 높은 응집력을 유지하지 않으면 가장 이상한 결합 문제로 끝날 수 있습니다.
greetz
back2dos
어느 것을 사용하는 것 사이에는 상충 관계가 있습니다. 싱글 톤은 상태를 가질 수도 있고 없을 수도 있으며 객체를 참조합니다. 상태를 유지하지 않고 전역 액세스에만 사용되는 경우 이러한 메서드가 더 빠르기 때문에 정적이 더 좋습니다. 그러나 객체와 OOP 개념 (상속 다형성)을 활용하려면 싱글 톤이 더 좋습니다.
예를 들어 보자 : java.lang.Runtime은 java의 싱글 톤 클래스입니다. 이 클래스는 각 JVM에 대해 다른 구현을 허용합니다. 구현은 JVM 당 단일입니다. 이 클래스가 정적이라면 JVM을 기반으로 다른 구현을 전달할 수 없습니다.
이 링크가 정말 유용하다는 것을 알았습니다. http://javarevisited.blogspot.com/2013/03/difference-between-singleton-pattern-vs-static-class-java.html ?
도움이 되었기를 바랍니다 !!
나를 위해 "객체 상태는 싱글 톤을 사용하고, 함수는 정적 방법을 사용하고 싶다"
그것은 당신이 원하는 것에 달려 있습니다. 객체 상태 (예 : null
, 대신 Null 상태와 같은 다형성 또는 기본 상태) 를 원할 때마다 싱글 톤이 적절한 선택이지만 함수가 필요할 때 정적 메서드가 사용됩니다 (입력을 수신 한 다음 출력을 반환).
싱글 톤 케이스를 권장합니다. 인스턴스화 된 후에는 항상 동일한 상태 여야합니다. 복제 할 수없고 설정할 값을받지 않아야합니다 (파일의 정적 구성 (예 : Java의 속성 파일) 제외 ).
추신 :이 둘 사이의 성능은 밀리 초 단위로 다르므로 먼저 아키텍처에 집중하십시오 .
Singleton은 무국적자가 아니며 글로벌 상태를 유지합니다.
Singleton을 사용할 수있는 몇 가지 이유는 다음과 같습니다.