2016-03-23 17 views
1

は、私は、委任KotlinプロパティでのJavaFX Propertyインターフェイスを実装しようとしている機能:は、それがそうのように使うことができるように

class Foo(bar:Bar){ 
    val barProperty=PropertyFX(bar) 
    var bar by barProperty 
} 

私は(主に)機能し、このための小さなクラスを書いた:

class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{ 
    override fun getValue(thisRef:Any?,property:KProperty<*>)=get() 
    override fun setValue(thisRef:Any?,property:KProperty<*>,value:T)=set(value) 
} 

しかし、このクラスは、インタフェースのgetBean()とのgetName()メソッドを実装していません。 getValue()関数とsetValue()関数で参照されている引数からそれぞれthisRefとproperty.nameという値を返す必要がありますが、関数外の引数にはアクセスできません。

私はそうのように、値に彼らが使用している最初の時間を格納することができ:

class PropertyFX<T>(value:T):SimpleObjectProperty<T>(value),ReadWriteProperty<Any?,T>{ 
    private var bean:Any?=null 
    private var name="" 
    override fun getBean()=bean 
    override fun getName()=name 
    override fun getValue(thisRef:Any?,property:KProperty<*>):T{ 
     bean=thisRef 
     name=property.name 
     return get() 
    } 
    override fun setValue(thisRef:Any?,property:KProperty<*>,value:T){ 
     bean=thisRef 
     name=property.name 
     set(value) 
    } 

しかし、これはひどいハックのように思えるし、それがされるまでgetBean()getName()に正しい値を返しません。プロパティは一度アクセスされます。 SimpleObjectPropertyのように、これらの値をコンストラクタに渡さずに先に取得する方法はありますか?

答えて

1

Kotlin 1.1(1.1-M04以降)では、provideDelegate演算子の規則を使用して、デリゲートのインスタンスが作成されるときに一度呼び出される関数を定義できます。あなたの例では、provideDelegatePropertyFXに宣言し、コンテナとプロパティに関する情報を持つ新しいデリゲートを返します。詳細情報:https://blog.jetbrains.com/kotlin/2016/12/kotlin-1-1-m04-is-here/#provide-delegate

2

代理プロパティの初期設定時に追加のメソッドpropertyDelegated()が呼び出されたプレリリース版のKotlinではこれが可能でした。このメソッドは1.0より少し前に削除されましたが、将来のバージョンではその機能(または同等の機能)が再追加される可能性があります。

今のところ、私はあなたの既存の解決策が最も良い可能性があると考えています。

関連する問題