あなたがしなければならないことは、プロパティを複製し、次にカスタムセッター、またはDelegates.observable
を使用してこれを達成できるということです。ここで
は、カスタムセッターでそれを行う方法ですが、ここであなたはつもりにも最新のコンストラクタで宣言されたものを保つ公開さname
とage
プロパティにアクセスすることだ: data class Person(private var _name: String, private var _age: Int) {
var name = _name
set(value) {
println("Name changed from $name to $value")
field = value // sets the backing field for `name`
_name = value // sets the `_name` property declared in the primary ctor
}
var age = _age
set(value) {
println("Age changed from $age to $value")
field = value
_age = value
}
}
トンのいずれかの
data class Person(private var _name: String, private var _age: Int) {
var name: String by Delegates.observable(_name) { prop, old, new ->
println("Name changed from $old to $new")
_name = new
}
var age: Int by Delegates.observable(_age) { prop, old, new ->
println("Age changed from $old to $new")
_age = new
}
}
使用法:ここにあなたの唯一のオーバーヘッドが新しい値にコンストラクタで宣言されたプロパティを設定して、あなたのための作業の一部を行いDelegates.observable
と同じ考え方、あなたがあるためにあなたのクラスを必要としなかった場合は
:以下の質問に答えるために
val sally = Person("Sally", 50)
println(sally) // Person(_name=Sally, _age=50)
sally.age = 51 // Age changed from 50 to 51
println(sally) // Person(_name=Sally, _age=51)
println(sally.name) // Sally
println(sally.age) // 51
編集:HESEは、この(toString
は、アンダースコアで少し醜いになります)のように見えますデータクラスでは、おそらく最も簡単な解決策は次のとおりです。
class Person(name: String, age: Int) {
var name: String by Delegates.observable(name) { _, old, new ->
println("Name changed from $old to $new")
}
var age: Int by Delegates.observable(age) { _, old, new ->
println("Age changed from $old to $new")
}
}
このようにして、 d ageをパラメータとして指定しますが、クラス本体の内部にあるプロパティに割り当てられます。データクラスのすべてのコンストラクタパラメータはプロパティでなければならないため(val
またはvar
とマークされている)、これはデータクラスでは不可能です。詳細については、constructors,propertiesおよびdata classesに関するドキュメントをご覧ください。
データクラスの例がコンパイルされない – voddan
データクラスの代わりに通常のクラスを使用できない場合、このような状況はありません。ただ言って。 – voddan