2011-01-12 2 views
2

다른 객체가 싱글 톤에 대한 포인터를 얻는 효과적인 방법은 무엇입니까? 제 경우에는 응용 프로그램 초기화시 생성 된 Data 객체가 있습니다. 많은 객체가이를 필요합니다. final이며 전체 응용 프로그램 수명주기에 있어야합니다. 데이터 공유는 interface (필드는 공개되지 않음)을 통해 이루어집니다.다른 객체가 싱글 톤에 대한 포인터를 얻는 효과적인 방법은 무엇입니까?

  1. 어떻게 객체 참조 Data에 을 얻어야한다 :

    이것은 실제로 하나에 두 가지 질문입니까?

  2. 그들은 한 번만 을 가져와 저장해야합니까, 아니면 그것을 모두 받아야합니까? 시간이 필요합니까?

답변

4

1 - 데이터 클래스 정의 내의 접근 자 메소드가 트릭을 수행해야합니다.

public class Data 
{ 
    private static Data myData = null; 

    private Data() // Private constructor for singletons 
    { 
    // ... 
    } 

    public static Data getInstance() 
    { 
    if(myData == null) 
     myData = new Data(); 

    return myData; 
    } 
} 

2 - 나는 자바에서 참조로 저장 될 것이고 객체의 사본이 아니라고 생각한다. 그래서 나는별로 중요하지 않을 것이라고 생각한다. 어느 쪽을 코딩 하든지간에 선호합니다.

+1

접근 자 메서드 'getInstance'의 이름을 지정하는 것이 좋습니다. 그것이 싱글 톤 클래스라는 사실을보다 분명히하는 데 도움이됩니다. – Marcelo

+0

@Marcelo 예, 당신은 절대적으로 맞습니다. 그것은 내 부분에 대한 감독이었습니다. 내 대답을 편집했습니다. – rchanley

+1

은 myData 선언에서'final'을 제거해야합니다. – Pete

1

나는 싱글 톤에 대해 모두 알기 위해 EFFECTIVE JAVA에서 ITEM # 1을 요청할 것입니다.
당신은 모든 것을 안팎으로 알 수 있습니다.

+1

... 한 번 읽으면 항목 # 1 ... 모두 읽으십시오! 그 책의 모든 내용은 단지 멋지다. – Marcelo

+0

전적으로 동의합니다. –

+1

이 책은 rchanley와 비슷한 예이며 끝 부분에 매우 멋진 메모가 있습니다. 가장 좋은 방법은'enum '입니다. 에서와 같이,'[public] enum Data {INSTANCE; }'. 열거 형은 메소드, 필드를 가질 수 있고 인터페이스를 구현할 수 있기 때문에'Data.INSTANCE.foo()'등으로 모든 것을 할 수 있고 접근 할 수 있습니다.'enum'이'public'이면 어디서나 액세스 할 수 있습니다. – Pete

관련 문제