Java / Kotlinはメンバー変数の監視を実装します

一般的なアプローチは次のとおりです
。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よりも簡潔であることがわかります

おすすめ

転載: blog.csdn.net/m0_47202518/article/details/110392311