IT

정적 메서드 대신 싱글 톤을 사용하는 이유는 무엇입니까?

lottoking 2020. 9. 14. 21:21
반응형

정적 메서드 대신 싱글 톤을 사용하는 이유는 무엇입니까?


헬퍼 / 유틸리티 클래스에 대한 다음과 같은 질문에 대한 좋은 답변을 질문합니다.

정적 메서드를 사용하는 대신 싱글 톤 (상태 비 저장)을 만드는 이유는 무엇입니까?

개체에 상태가없는 경우 개체 인스턴스가 필요한 이유는 무엇입니까?


싱글 톤은 종종 애플리케이션에 일종의 전역 상태도입하는 데 사용됩니다 . (정직하게 말하면 필요한 것보다 더 자주 필요한 것, 그것은 다른 시간에 대한 주제입니다.)

그러나 상태 비 저장 싱글 톤도 유용 할 수 있는 몇 가지 코너 케이스 가 있습니다.

  • 가까운 장래에 주와 함께 확장 할 것이라고 예상합니다.
  • 특정 기술적 인 이유로 개체 인스턴스 가 필요합니다 . 예 : C # 또는 Java 문에 대한 동기화 개체 .
    locksynchronized
  • 상속이 필요합니다. 즉, 동일한 인터페이스를 사용하지만 다른 구현을 사용하여 싱글 톤을 다른 싱글 톤으로 쉽게 대체 할 수 있기 때문입니다.
    예 : Toolkit.getDefaultToolkit()Java 메소드는 정확한 유형이 시스템에 따라 달라지는 싱글 톤을 반환합니다.
  • 센티넬 값에 대한 참조 동등성원합니다 . 예 : C #에서.
    DBNull.Value

정적 메서드 클래스 대신에 Stateless 싱글 톤이 사용되는 경우, 즉 종속성 주입 의 경우를 볼 수 있습니다 .

직접 사용하는 유틸리티 함수의 도우미 클래스가있는 경우 숨겨진 함수가 생성됩니다. 누가 또는 어디서 사용할 수 있는지 제어 할 수 있습니다. 상태 비 저장 싱글 톤 인스턴스를 통해 동일한 도우미 클래스를 삽입하면 위치와 방법을 제어하고 필요할 때 대체 / 모의 작업 등을 수행 할 수 있습니다.

단일 톤 인스턴스로 만드는 것이 필요한 것보다 더 많은 유형의 수업을 할당하지 않도록 보장합니다.


대답을 찾았습니다. 정적 메소드는 테스트하기가 더 어렵습니다.

대부분의 테스트 프레임 워크는 인스턴스 메서드를 모의하는 데 훌륭하게 작동하지만 대부분은 정적 메서드의 적절한 방식으로 처리하지 않습니다.


대부분의 프로그래밍 언어에서 클래스는 많은 유형 시스템을 피합니다. 정적 메서드와 변수가 클래스는 클래스 클래스 인터페이스를 구현하거나 다른 클래스를 확장 할 수 없습니다. 따라서 다른 유형의 하위 유형이 될 수 없기 때문에 다형성 방식으로 사용할 수 없습니다. 당신이 인터페이스가있는 경우 예를 들어, 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을 사용할 수있는 몇 가지 이유는 다음과 같습니다.

  • 메모리 누수를 방지하려면
  • 애플리케이션의 모든 모듈에 대해 동일한 상태를 제공하기 위해 (예 : 데이터베이스 연결)

참고 URL : https://stackoverflow.com/questions/2765060/why-use-a-singleton-instead-of-static-methods

반응형