6

特性を考えると(簡略化)

trait A {
  val eventStream: EventStream
  val credentialsStorage = // something here
  val userStorage = // something here
  val crypto = // something here
  ...    
  lazy val authSvc = new CoreAuthentication(credentialsStorage, new AuthenticationProviderResolver, userStorage, eventStream, crypto)
}

class T extends A with TraitProvidingEventStream with FlatSpec with [lot of another traits here] {

  val eventStream = systemFromTraitProvidingEventStream.eventStream

  "This" should "work" in {
    println(authSvc) // this is "magic"
    val user = authSvc.doSomethingWithUser(...);
  }
}

//this is "magic" とマークされた行を削除すると、次の行で NullPointerException が発生するため、authSvc は null になります。

何が間違っている可能性がありますか?

そのためのきれいな小さなテストケースを作成できませんでした。通常、これはうまく機能します

4

1 に答える 1

5

これは ML で一度発生しました。遅延 val を初期化するときに例外がスローされた場合、val は null です。ただし、もう一度初期化を試みると、魔法のように機能する可能性があります。(つまり、lazy val の「初期化済み」ビット フラグは、最初に初期化に失敗したときに設定されません。)

ML のケースは、特性の val の初期化順序に関係していると思うので、それが問題なのかもしれません。それに依存することは悪名高いほど危険であるため、特性で defs を使用することをお勧めします。DelayedInit に関する Luigi のコメントを参照してください。

于 2012-11-24T18:32:42.117 に答える