2009/05/29

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の仕組みがようやく少しずつ分かってきた。

2 件のコメント:

  1. PropertyChangeSupportとかはgroovyの話じゃなくて、Java Beansの基本みたいですね。Beansといえば、getter、setterくらいしか知らなかったけど、もっといろんなことが考えられてたんですね。
    Beansっぽい考えかたも、設計にとりいれてきたいものです。gingerに向けて。

    返信削除
  2. >>fujwaraさん
    ginger…開発すすめないとですねw

    返信削除