一般的なアプローチは次のとおりです
。1。クラスPropertyChangeAwareを作成し、その中にメンバー変数changeSupportを作成して、このメンバー変数を初期化します
。他のクラスメンバー変数の変更を記録できます。2。PropertyChangeAwareから監視する必要のあるクラスを継承します。このクラスが含まれるように、changeSupportが含まれ
ます。3。メンバー変数のsetメソッドを記述し、値の変更をchangeSupoortに記録します。
3.リッスンする必要のあるクラスにリスナーを追加します。実際にリスナーをchangeSupoortに追加し、propertyChangeメソッドを実装します。したがって、メンバー変数がsetメソッドを呼び出すたびに、changeSupoortが記録され、propertyChangeメソッドが実行されます。
- これはPropertyChangeAwareクラスです
package edu.wang.af;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
public class PropertyChangeAware {
protected PropertyChangeSupport changeSupport=new PropertyChangeSupport(this);
public void addPropertyChangeListener(PropertyChangeListener listener) {
changeSupport.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener) {
changeSupport.removePropertyChangeListener(listener);
}
}
- これはPerosnクラスであり、監視の効果をテストします
package edu.wang.af;
public class Person extends PropertyChangeAware{
private String name;
private int age;
Person(String name,int age){
super();
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
String oldName=this.name;
this.name=name;
changeSupport.firePropertyChange("name",oldName,name);
}
public static void main(String[] args) {
Person person=new Person("何老表",69);
person.addPropertyChangeListener(e->{
System.out.println("属性名:"+e.getPropertyName()+" 旧值:"+e.getOldValue()+" 新值:"+e.getNewValue());
});
person.setName("梁胖");
}
}
- もちろん、Kotlinデリゲート属性を使用すると、他のカテゴリにデリゲートするためのsetメソッドとgetメソッドの結果
がより簡単になります。
たとえば、アカウントの残高の変化を監視したい
- 以下はPropertyChangeAwareクラスです
package com.wang.bank
import java.beans.PropertyChangeListener
import java.beans.PropertyChangeSupport
open class PropertyChangeAware {
protected val changeSupport= PropertyChangeSupport(this)
fun addPropertyChangeListener(listener: PropertyChangeListener)
=changeSupport.addPropertyChangeListener(listener)
fun removePropertyChangeListener(listener: PropertyChangeListener)=
changeSupport.removePropertyChangeListener(listener)
}
- 以下はObservablePropertyです
package com.wang.bank
import java.beans.PropertyChangeSupport
import kotlin.reflect.KProperty
class ObservableProperty(var propValue:Double, private val changeSupport: PropertyChangeSupport) {
operator fun getValue(account: Account,prop:KProperty<*>)=propValue
operator fun setValue(account: Account,prop: KProperty<*>,newValue: Double) {
val oldValue = propValue
propValue = newValue
changeSupport.firePropertyChange(prop.name,oldValue,newValue)
}
}
package com.wang.bank
class Account(val name:String, balance:Double):PropertyChangeAware() {
var balance:Double by ObservableProperty(balance,changeSupport)
}
上記のコードは、プロパティをObservablePropertyに委任します。これは非常に簡潔
で、より単純なメソッドがあります。Delegates.observable()を使用します。
package com.wang.bank2
import com.wang.bank.PropertyChangeAware
import kotlin.properties.Delegates
import kotlin.reflect.KProperty
class Account2(val name:String,balance:Double) :PropertyChangeAware(){
private val observer={
//顺序不可调换
prop:KProperty<*>,oldValue:Double,newValue:Double->
changeSupport.firePropertyChange(prop.name,oldValue, newValue)
}
var balance:Double by Delegates.observable(balance,observer)
}
Kotlinの利点は実際にJavaよりも簡潔であることがわかります