Groovy 1.6のBindable
groovy1.6の紹介記事 - おっさんの手習いにgroovy1.6の新機能についての説明が日本語で出ているよとかかれていたので読んでみた。
1.6の新機能がよく分かっていなかったけど、分かってきた。
groovyConsoleの実行結果がJTableで表示可能とか、おもしろい。
特におもしろいと思ったのはBindableアノテーションの機能。
PropertyCangeSupportの機能自体しらなかったからこそですが。
以下のコードにて。
MyBeanオブジェクトにPropertyChangeListenerを追加することで、プロパティ変更時に処理を行うことが可能。
複数渡せば複数の処理が可能。
#!/usr/bin/env groovy import java.beans.PropertyChangeSupport import java.beans.PropertyChangeListener import java.beans. PropertyChangeEvent class MyBean { private String name = "たろう" PropertyChangeSupport pcs = new PropertyChangeSupport(this) void addPropertyChangeListener(PropertyChangeListener l) { pcs.addPropertyChangeListener(l) } void removePropertyChangeListener(PropertyChangeListener l) { pcs.removePropertyChangeListener(l) } String getName() { return name } void setName(String name) { pcs.firePropertyChange("name", this.name, this.name = name) } } def bean1 = new MyBean() bean1.addPropertyChangeListener({ evt -> println "old:${evt.oldValue}, new:${evt.newValue}" } as PropertyChangeListener) bean1.addPropertyChangeListener({ evt -> println "別途追加したListner" } as PropertyChangeListener) def bean2 = new MyBean() bean1.name = "はなこー" bean2.name = "さぶろー"
同様の処理を@Bindableアノテーションを利用すると非常に簡単になる。addPropertyCangeListenerメソッドは勝手に追加されてる。
#!/usr/bin/env groovy import java.beans.PropertyChangeListener import groovy.beans.Bindable class MyBean { @Bindable String name = "たろう" } def bean1 = new MyBean() bean1.addPropertyChangeListener({ evt -> println "old:${evt.oldValue}, new:${evt.newValue}" } as PropertyChangeListener) bean1.addPropertyChangeListener({ evt -> println "別途追加したListner" } as PropertyChangeListener) def bean2 = new MyBean() bean1.name = "はなこー" bean2.name = "さぶろー"
これはおもしろい。setterメソッドにフィルタはさんでもいけるんだろうけど、こっちを使った方がプロパティ変更時にやりたいんだよ!!っていう設計上の用途が伝わりやすいのかな。
griffonの仕組みがようやく少しずつ分かってきた。
ディスカッション
コメント一覧
PropertyChangeSupportとかはgroovyの話じゃなくて、Java Beansの基本みたいですね。Beansといえば、getter、setterくらいしか知らなかったけど、もっといろんなことが考えられてたんですね。
Beansっぽい考えかたも、設計にとりいれてきたいものです。gingerに向けて。
>>fujwaraさん
ginger…開発すすめないとですねw