次のように、不変のクラス Outer と Inner があります。
class Outer(val intra: Outer#Inner) {
class Inner(val q: Int)
}
次のように、相互に参照する Outer と Inner のインスタンスを作成します。
val outer = new Outer(inner)
val inner = new outer.Inner(5)
ただし、もちろん、このコードは、値「inner」が 2 行目に定義される前に 1 行目に参照されているため、コンパイルされません。
また、これら 2 行の「val」キーワードの前に「lazy」キーワードを追加すると、コンパイルは実行されますが、実行中にスタック オーバーフロー例外が発生します。
次のように Outer クラスを変更可能にすると、この問題を解決できることがわかります。
class Outer(var intra: Outer#Inner) {
class Inner(val q: Int)
}
val outer = new Outer()
val inner = new outer.Inner(5)
outer.intra = inner
しかし、私はクラスを不変に保ちたいと思っています。どうすればこの問題を解決できますか?