초기화 순서 : 각 개체가 초기화 좀 더 가지 내부에 있기 때문에, 그때객체 상호 참조와 나는 다음과 같은 코드를 한
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
클래스를 확장하여 자신의 싱글 톤을 생성 할 수 있습니다.
가능한 한 적은 상용구로 이것을 수행하는 가장 좋은 방법은 무엇입니까?
가능한 복제본 [불변 쌍 파일 개체] (http://stackoverflow.com/questions/7507965/instantiating-immutable-paired-objects). 간단히 말해서 :'abstract class SuperClass (cs : => Seq [SuperClass]) ' – sschaef
@sschaef : 음 ... 당신은 그것을 시도 했습니까? 나는 그것을 작동시킬 수 없다. Seq는 어쨌든 by-name으로 전달되기 전에 빌드됩니다. 그리고 닭고기 달걀 예제에 따르면, Seq를 게으르게 만들어야합니다. 하지만 생성자에게 전달하는 동안 생성하고 있으므로 게으르지 않습니다. 그리고 다른 곳에서는 게으름으로 정의하는 것도 매력적이지 않습니다 ... 그래, 나는 그것을 얻지 못한다! – noncom
정확히 무엇이 효과가 있습니까? 이것은 작동합니다 : https://gist.github.com/sschaef/4750334 – sschaef