Groovy Bean

http://www.kakutani.com/trans/ociweb/jnbFeb2004.html#groovy_beans


Groovyでは、以下のように属性の前の識別子を省略するとその属性はpublicとなる。

class Book {
	name
}

publicと言っても、上記のような定義の場合、Groovyの実行時に自動的に、setter/getterを生成してくれる。
つまり、以下のようなクラス定義を生成してくれる。

class Book {
	private name
	getName() {
		return name
	}
	setName(theName) {
		name = theName
	}
}

Javaでやる場合、setter/getterをいちいち定義しなきゃいけなかったのが、かなり簡単。
もし、単純なsetter/getterでなく独自の振る舞いのsetter/getterを用意したければ自分で用意すればよい。


さらに、コンストラクタで属性の初期値を与えて、クラスの初期化をするとき、
上記のBookクラスを例にとると、Javaの場合、

public class Book {
	private String name;
	public Book(String theName) {
		name = theName;
	}
	・・・
}

のように、name属性の初期値を設定するコンストラクタを用意しなければならない。
その点、Groovyの場合、以下のコードを書くだけでよい。

class Book {
	name
}

このコードは最初に示したコードと同じである。
そして、実際にクラスを使用するところで以下のように記述する。

book = new Book(name:"hogehoge")

上記により、Groovyは以下のようなコードを実行してくれる。

book = new Book()
book.name = "hogehoge" # 実際は、book.setName("hogehoge") が呼ばれる。

この仕組みは、複数の属性があるようなクラスを定義するとき、いちいちコンストラクタをつくらなくていいから、便利。


getter/setterの自動定義もそうだけど、こういうコードをすっきりさせてくれる仕組みがあるのがGroovyの魅力かしら。