2016-11-12 4 views
1

Kotlinが一度null以外の値で割り当てられたプロパティを追加すると、varプロパティがvalに変更される、つまり値をもう変更できないことを意味します。上記null値が割り当てられた後に、varからvalに変更されるプロパティ?

val? context Context? = null 
... 
... 
... 
context = this 
... 
... 
... 
context = this.applicationContext //would be an error since context 
            //is val 

それがどのように役に立つのほんの一例です...

答えて

4

私は、これはあなたが本当にこのケースで何をしたいかもしれないと思う:

val context:Context by lazy { this } 
+0

作品... –

0

これはすでに可能です:

fun test() { 
    val s : String 

    println(s) // Error: Variable 's' must be initialized 

    s = "Hello" 
    println(s) 

    s = "World!" // Error: Val cannot be reassigned 
} 

これ以外の方法では、これを行う方法はありません。たとえば、これをメンバープロパティとして使用する場合、コンパイラは、以前にメソッドが呼び出されたかどうか、および割り当てが許可されているかどうかを知ることはできません。

@ ligiの回答は良い選択肢です。

+1

私は、プロパティ男を意味し、関数内の変数ではありません。プロパティは常に初期化を要求しています。 –

+0

ありがとうございます。 –

+1

は常に正しくありません - "lateinit"を見てください – ligi

2

「特別な」振る舞いを持つすべての種類のプロパティは、delegated propertiesで処理されます。

すべての機能要求はthe official Kotlin issue trackerにする必要があります。実際には、あなたが提案したものに対してすでにKT-7180というリクエストがあります。ここで

は(問題の)可能な実装である:ここでは

class InitOnceVar<T>() : ReadWriteProperty<Any?, T> { 
    private var initialized = false 
    private var value: T? = null 

    override fun get(thisRef: Any?, desc: PropertyMetadata): T { 
     if (!initialized) throw IllegalStateException("Property ${desc.name} should be initialized before get") 
     return value 
    } 

    override fun set(thisRef: Any?, desc: PropertyMetadata, value: T) { 
     if (initialized) throw IllegalStateException("Property ${desc.name} could be initialized only once") 
     this.value = value 
     initialized = false 
    } 
} 

は、あなたがそれを使用する方法です:のみ、この問題の

var x: String by InitOnceVar() 
x = "star" 
x = "stop" //Exception 
関連する問題