【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
はメンバー変数(プロパティ)に代入した後に発生するというのがポイント。
コメント
コメントを投稿