2013-02-09 6 views
0

초기화 순서 : 각 개체가 초기화 좀 더 가지 내부에 있기 때문에, 그때객체 상호 참조와 나는 다음과 같은 코드를 한

Initializer.init 

및 전화, 처음에 너무

abstract class SuperClass (cs: Seq[C]) { 
    def init {} 
} 

object A extends SuperClass(Seq(B, C)) 
object B extends SuperClass(Seq(A, D)) 
object C extends SuperClass(Seq(A, B)) 
object D extends SuperClass(Seq(C, B, A)) 
object E extends SuperClass(Seq(B, A, B)) 

object Initializer { 
    def init { 
    A.init 
    B.init 
    C.init 
    D.init 
    E.init 
    } 
} 

을 어떤 점에서 프로그램의 어느 지점에서 더 이상 객체의 cs 매개 변수를 사용할 때 에서 참조되는 객체 중 하나가 실제로 null (콘솔 sh로 출력되기 때문에 NullPointerException이됩니다. 빚지고있어). 즉, 참조하는 다른 객체의 init보다 나중에 호출되는 init이있는 객체에 대한 참조는 null으로 설정되는 경향이 있습니다.

이것은 흥미로운 상황입니다. 나는 여기에 any-to-any 임의적 인 상호 참조를 가지고 있으며, 외부 메소드 (예를 들어 어쨌든 캡슐화의 해체)로 완전히 초기화하지 않고 초기화를 제대로 구현하는 방법을 모른다. 특히 사용자는 SuperClass 클래스를 확장하여 자신의 싱글 톤을 생성 할 수 있습니다.

가능한 한 적은 상용구로 이것을 수행하는 가장 좋은 방법은 무엇입니까?

+0

가능한 복제본 [불변 쌍 파일 개체] (http://stackoverflow.com/questions/7507965/instantiating-immutable-paired-objects). 간단히 말해서 :'abstract class SuperClass (cs : => Seq [SuperClass]) ' – sschaef

+0

@sschaef : 음 ... 당신은 그것을 시도 했습니까? 나는 그것을 작동시킬 수 없다. Seq는 어쨌든 by-name으로 전달되기 전에 빌드됩니다. 그리고 닭고기 달걀 예제에 따르면, Seq를 게으르게 만들어야합니다. 하지만 생성자에게 전달하는 동안 생성하고 있으므로 게으르지 않습니다. 그리고 다른 곳에서는 게으름으로 정의하는 것도 매력적이지 않습니다 ... 그래, 나는 그것을 얻지 못한다! – noncom

+0

정확히 무엇이 효과가 있습니까? 이것은 작동합니다 : https://gist.github.com/sschaef/4750334 – sschaef

답변

1

다음 해결책을 찾았습니다. 그것은 Instantiating immutable paired objects의 절반 복제지만, Seq에 의해 정의 된 종속성은 추가 차원입니다.

abstract class SuperClass (cs: => Seq[SuperClass]) { 
    SuperClass.collected += this 
    def init {} 
} 
object SuperClass { 
    private val collected = ListBuffer[SuperClass]() 
    def init = collected.foreach(_.init) 
} 
object Initializer { 
    def init { 
    A // access the root object 
    SuperClass.init // call init on all automatically created dependent objects 
    } 
} 
+0

글쎄, 당신은 초기화 루틴을 향상 시켰습니다 ..하지만 초기화 순서 문제를 해결하지 못하는 것처럼 보입니다. 나는 그것이 초기화를 자동화한다는 것을 이해합니다. 원래 질문에 대한 sschaef의 코멘트에 대한 내 의견을 참조하십시오 ... – noncom

+0

누가 순서대로 개체를 초기화해야한다고 말했습니까? 또한 - 네 - 내 솔루션을 경우에만 연결된 A 해당 개체를 초기화하는 것입니다. 그러나 이것은 개별적으로 각 개체를 초기화하는 것보다 좀 더 일반적인 방법입니다. 또한 응용 프로그램에서 사용할 시작 지점이나 루트 객체가있을 수도 있습니다. 그것은 모든 것이 어떻게 사용될 것인가에 달려 있습니다. 위의 의견은 당신이 그것을 얻지 못한다고 말합니다 - OK ... –