2011-12-01 4 views
0

인스턴스화해야하는 싱글 톤이 있다고 가정합니다. 생성자에서는 타이머를 시작하고 매 초마다 일부 모델 데이터를 업데이트합니다.프로그램에서이 인스턴스가 필요하지 않은 경우 싱글 톤 인스턴스를 만들 위치는 어디입니까?

싱글 톤 생성자를 실행하려면 참조해야합니다. 전체 인스턴스를 실행하는 동안 존재해야하는 싱글 톤으로 처리 할 필요가 없으므로 인스턴스가 필요하지 않습니다.

그러나 C#을 같은 구조를 허용하지 않습니다 WcfLoader.Instance;

그래서 나는이 WcfLoader loader = WcfLoader.Instance;를 사용해야하지만 난 loader 인스턴스를 사용하지 않습니다.

이상하게 보입니다. 내가 잘못한 것을 의미합니까?

답변

3

클래스에 정적 Init 메서드를 추가 한 다음 인스턴스를 가져 오는 대신 WcfLoader.Init을 호출하십시오. 그것은 전혀 이상하게 보이지 않을 것입니다.

+0

사실, 말한 것처럼 Init 메서드를 만들고 심지어 싱글 톤의 인스턴스 속성 내에서 사용하십시오. – oscilatingcretin

+1

@scilatingcretin 'Instance' 속성 게터의 부작용으로 init를 호출하는 것은 좋은 생각이라고 생각하지 않습니다. – CodesInChaos

+0

왜 안 되니? 그냥'if (_whatever == null)와 같이 시작하십시오. Init(); return _whatever;' – oscilatingcretin

1

Instance 속성을 가져 오는 부수 효과로 만들지 마십시오. 재산을 얻는 것은 부작용이 없어야합니다.

InitTimer() 또는 그와 유사한 것을 싱글 톤에 추가하십시오.

public class WcfLoader { 

    static WcfLoader _instance; 

    public WcfLoader() { 
     if (_instance == null) { 
     // do the initialization 
     _instance = this; 
     } 
    } 
} 

그런 다음 초기화도 어디서든 참조를 저장하지 않고 생성자를 호출에 구성 :

0

또한 인스턴스 생성자를 포함 할 수있다.

// just create a new object which causes the initialization code to execute 
new WcfLoader(); 

물론 명시 적 초기화 방법 (다른 사람들이 언급 한대로)이 최선의 선택입니다.

관련 문제