2011-12-15 2 views
1

내가 모델을 가지고 있다고 가정 해 보겠습니다.이 모델은 싱글 톤이므로 단 하나의 인스턴스 만 있습니다. 이 모델을 다른 클래스에 전달하고 변수를 변수에 보관합니다.객체에 대한 참조 문제

그런 다음 나중에 동일한 모델을 모델의 직렬화 된 버전과 함께 원점으로 대체합니다. 이 모델의 변수를 포함하는 다른 클래스는 이전의 참조 권한을 여전히 가리 킵니다.

모델을 새 참조로 바꾸고 다른 모든 클래스를이 새 클래스로 가리 키려면 어떻게해야합니까?

답변

1

이러한 다른 객체가 모두 싱글 톤에 대한 참조를 보유하는 경우 새 인스턴스를 전달하는 메소드를 호출하고 변수를 다시 설정하여 수동으로 업데이트해야합니다.

더 똑똑한 방법은 그 자체가 싱글 톤을 참조하고 다른 모든 객체가 액세스 한 간단한 래퍼 객체를 전달하는 것입니다. 새 싱글 톤으로 업데이트해야 할 때 래퍼의 참조 만 변경하면됩니다.

일반적인 싱글 톤 구현은 싱글 톤 클래스에 정적으로 get() 메서드를 공개적으로 노출하고, 싱글 톤을 방문자와 같이 전달하는 대신이 메서드를 호출하는 다른 클래스에 남겨 두어 단순화합니다.

+0

감사합니다. 지금 상황이 더 분명합니다. –

0

일반적으로 싱글 톤을 직렬화 및 비 직렬화하는 것은 매우 나쁜 생각입니다. 객체의 인스턴스가 많아 질 수 있으며 더 이상 싱글 톤의 용도로 사용될 수 없습니다. 차라리 전체 객체가 아닌 내 싱글 톤이 보유하고있는 주요 컨텐츠를 직렬화합니다.

이렇게 직렬화해야 할 필요가있는 경우 클래스를 등록 할 때 일종의 레지스트리를 활용해야하며 직렬화는 등록 된 모든 클래스의 변경 사항을 알립니다.

+0

모델이 변경되었다는 것을 경고하는 관찰자 인터페이스가있는 것 같습니다. 고마워요. –

+0

@Pat, 일종의, 관찰 할 수 있지만 여기에 싱글 톤 (때문에 전체 참조 변경) :-). 레지스트리와 같은 더 정적 인 관찰 가능성이 필요하고, 모든 소비자가 스스로 등록하고, 직렬화 프로세스가 변경 사실을 알립니다! – aishwarya

관련 문제