【KotlinとJava】プロパティの監視

KotlinとJava

委譲プロパティではDelegateを宣言してプロパティの入出力を監視する方法を紹介した。ラムダ式を利用するとより簡単に実装できる。

Observable property.kt

import kotlin.properties.Delegates  
  
class User {  
    var name: String by Delegates.observable("no name") {  
        prop, old, new ->
            println("$old -> $new")  
    }  
}  
  
fun main(args: Array<String>) {  
    val user = User()  
    user.name = "first"  
    user.name = "second"  
}

リンク

observable and vetoable

Delegates.observableを利用することで、値が変化したタイミングに処理を挟むことができる。Delegates.observableは値が変わってしまった後に呼ばれるため、値が変わる前のタイミングに挟み込みたいときはDelegates.vetoableを利用する。

以下のように記述すれば、マイナスの数値の代入を試みても、メンバー変数(プロパティ)の内容は変化しない。

var age: Int by Delegates.vetoable(15) {  
    prop, old, new ->  
        0 <= new  
}

Javaで記述

対比ができるようにJavaでも同じものを記述してみよう。

public class User {  
    private String name = "no name";  

    public void setName(String newValue) throws NoSuchFieldException {  
        String oldValue = this.name;  
        this.name = newValue;  
        onChange(this.getClass().getDeclaredField("name"), oldValue, newValue);  
    }  
  
    private void onChange(Field prop, String oldValue, String newValue) {  
        String template = "%s -> %s";  
        System.out.println(String.format(template, oldValue, newValue));  
    }  
}

public class Exp19 {  
    public static void main(String[] args) throws NoSuchFieldException {  
        final User user = new User();  
        user.setName("first");  
        user.setName("second");  
    }  
}

observableはメンバー変数(プロパティ)に代入した後に発生するというのがポイント。

コメント

このブログの人気の投稿

【KotlinとJava】分解宣言

wxPythonでのモーダルダイアログ作成