2016-10-29 4 views
1

フィールドの初期化を遅延させ、アサートを実行するにはどうすればよいですか?プロパティを遅延的に初期化してアサートすることは可能ですか?

私は

val table: Array<FormatInfo> by lazy { 
    val t = arrayOf(...) 
    assert(table.size == FORMAT_COUNT, { System.err.println("GLI error: format descriptor list doesn't match number of supported formats") }) 
    t 
} 

をしようとしたが、それはオーバーフローに行く:

java.lang.StackOverflowError 
    at gli.GliKt$table$2.invoke(gli.kt:451) 
    at gli.GliKt$table$2.invoke(gli.kt) 
    at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:131) 
    at gli.GliKt.getTable(gli.kt) 
    at gli.GliKt$table$2.invoke(gli.kt:693) 
    at gli.GliKt$table$2.invoke(gli.kt) 
    at kotlin.SynchronizedLazyImpl.getValue(Lazy.kt:131) 
    at gli.GliKt.getTable(gli.kt) 
    at gli.GliKt$table$2.invoke(gli.kt:693)... 

どうすれば解決できますか?

+0

をところで、私は 'field' – voddan

+0

は、例外が発生したコードを隠さないではない、これは' property'と呼ばれていると思います。あなたが間違っていることを私たちに推測させてはいけません。 –

+0

両方とも固定、ありがとう – elect

答えて

3

スタックトレースは、lazy {}ラムダの内部からプロパティを呼び出すように見えますが、これは明らかにクラッシュさせます。

これは動作するはずです:

val table: Array<FormatInfo> by lazy { 
    val t = arrayOf(...) 
    myAssert(t) 
    t 
} 
+0

クラップ、私はそれを逃した、ありがとう! Btwはこれを、lazilyに 'property'を初期化し、それを主張する正しい方法ですか?それとも良い方法がありますか? – elect

+0

あなたの例を見ると、私はこのプロパティを全く怠っている理由を本当に理解できません。私は普通の財産に行きます。 – voddan

+0

ラムダで返されたものに物(アサートなど)を適用する場合は、一時変数の代わりに 'apply'を使うことをお勧めします。例: 'val table:Array by lazy {arrayOf(...)。apply {assert(this ...}}}'。 – mfulton26

関連する問題