2014-11-13 2 views
3

저는 새로운 프로그래머로서 모범 사례를 없애고 자합니다. 한 가지 방법으로 간단한 클래스를 작성합니다. 길이가 길고 메모리 크기를 나타내는 int를 반환합니다.이것이 싱글 톤을 잘 사용합니까?

저는이 메모리 모델 중 둘 이상을 원할 것입니다. 그리고 각각의 메모리 모델이 개별적인 싱글 톤이어야한다고 생각합니다. 그게 Singleton 패턴의 합리적인 사용인가요? 난 오직 하나의 인스턴스가 존재할 필요가 없지만, 이런 종류의 클래스는 개념적으로 싱글 톤인 것 같습니다. 그게 싱글 톤이되는 좋은 이유입니까? 아니면 개인 생성자를 추가하고 메서드를 정적으로 만드는 것이 합리적일까요? 아니면 나는 모든 것을 과소 평가하고 있습니까? 코드는 다음과 같습니다.

public class MemoryModel implements SomeInterface { 

    public int get(Long links) { 

     final int result; 

     if (links < 700_000) { 
      result = 50_000; 
     } else { 
      result = 140_000; 
     } 

     return result; 
    } 
} 

편집 : 모든 사람의 답변을 올바르게 이해하면 대답은 '아니오'입니다. 정확히이 클래스의 한 인스턴스가 필요하지 않습니다. 인스턴스를 전혀 인스턴스화 할 이유가 없습니다. 메소드를 정적으로 만들고 인스턴스화 할 필요가 없습니다.

또한 싱글 톤 패턴이 과도하게 사용되고 글로벌 엔티티를 생성하기 때문에 문제가 될 수있는 대답과 링크로부터 감각을 얻습니다. 싱글 톤은 단 하나의 인스턴스 만 존재하는 정당한 이유가있는 경우에만 사용해야합니다.

+2

추천 도서 : http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-had-since-1995/ –

+1

왜 '길게 ''긴 '대신'? 'null'을 테스트하지 않습니다. 즉,'links'가 null 인 경우'if' 문의 줄에서 NullPointerException을 얻습니다. –

+0

실제 코드에서 null을 테스트합니다. 아이디어가 명확해질 수 있도록 필수가 아닌 코드를 모두 꺼 냈습니다. – csjacobs24

답변

2

당신은 그것을 고정해야 ...

이 anway A의 당신이 가지고있는 클래스가없는 첫 번째 하나씩 일어나는 것. 싱글 톤은 하나의 인스턴스 만 생성한다는 것을 보장하는 클래스입니다.

둘째, 왜 인스턴스가 필요한지는 아직 언급 할 이유가 없습니다. 인스턴스가 객체의 상태를 유지하기를 원할 것입니다. 거기에있는 객체에는 상태가없고 (필드가 없으면 상태가 없음) 메소드 만 있으므로 정적으로 만들 수 있습니다.

+0

고마워! 그것은 총체적으로 의미가 있습니다. – csjacobs24

4

싱글 톤 클래스는 해당 클래스의 새 객체를 만들지 않고 동일한 클래스를 여러 위치에서 참조하려는 경우에 사용됩니다.

예를 들어 클래스의 인스턴스와 관련이 없으므로 public static 메서드에있는 것처럼 보입니다.

싱글 톤과 유틸리티 클래스의 차이점은 link입니다.

+0

링크를 가져 주셔서 감사합니다. "정적 유틸리티 클래스"에 대한 지식이 없습니다. 유용한 아이디어, 인스턴스화 할 이유가 없기 때문에 그렇게 구현할 것이다. – csjacobs24

1

여기에있는 싱글 톤 패턴이 아닙니다. 방금 클래스에 메서드가 있습니다.

아마 당신이 먼저 여기 읽을 수있는, 다시 싱글 톤을 구현하려고 :

Singleton Pattern

+0

나는 그것이 싱글 톤이 아니라는 것을 안다. 이것이 패턴을 사용하는 적절한 상황인지 궁금해하고있었습니다. 나는 그것이 아니라고 확신한다. – csjacobs24

1

단지 하나의 인스턴스 만 필요하다고해서 그것이 싱글 톤이되어야한다는 것을 의미하지는 않습니다. 너가 그것을 피할 수 있으면, 그것을하지 말라.

목표는 new MemoryModel()으로 한 번만 호출하는 것입니다. 문제는 다른 장소에서 해당 객체를 참조 할 수있는 방법이 필요하다는 것입니다.

하지만이를 수행하는 가장 좋은 방법은 해당 객체에 대한 참조를 전달하는 것입니다. 이것은 싱글 톤의 문제를 해결합니다 : 글로벌 static 레퍼런스를 제공합니다.

static final Object singleton = new Object(); 
static void doStuffBad() { 
    // bad.. hardcoded reference & also global state 
    System.out.println(singleton); 
} 

static void doStuffGood(Object reference) { 
    // good, this does not create any bad dependencies etc. 
    System.out.println(reference); 
} 

public static void main(String[] args) { 
    doStuffBad(); 
    doStuffGood(new Object()); 
} 

은 통과 참조 주위 바보 얻을 수있는 경우가 있습니다. 따라서 String.CASE_INSENSITIVE_ORDER (Comparator)과 같은 싱글 톤은 의미가 있습니다. 실제로 귀하의 경우에도 의미가있을 수 있습니다. 그것은 정말로 당신이 달성하고자하는 것과 왜 당신이 싱글 톤을 만들고 싶은지에 달려 있습니다. 서로 다른 장소의 오브젝트에 액세스해야하고 오브젝트 계층 구조가 너무 어색하게 지나치는 참조가 너무 고통 스럽기 때문에 하나를 원하면 안됩니다.

1

정적 함수입니다.

싱글턴 그것은 창조적 인 패턴입니다. 고유 한 인스턴스를 가질뿐만 아니라 생성 알고리즘을 캡슐화합니다.

싱글 톤을 사용하는 것은 의미가 없습니다. 싱글 톤을 사용하는 경우 메모리 사용을 복제하고, 정적 메서드가 있고, 힙 인스턴스를 가리키는 정적 변수가 있습니다. 하지만 정적 메서드를 사용하면 힙에만 정적 메서드가 없습니다 (Java에서 힙을 적게 사용하는 것이 좋습니다).

관련 문제