Groovyでインスタンス生成時のフィールドの初期化
Groovyではnewする際に、Mapを渡すことでフィールドに値を設定することができます。
当然渡されなかったフィールドは各型の初期値になります。
また、「TupleConstructor」というアノテーションを付けるとAST変換が行われ、コンストラクタのように引数を渡すことでフィールドに値を設定できます。(言い方変な気がする。。。)
尚、上から順に設定されているようで、型が異なると例外が発生しました。
※「ToString」アノテーションはインスタンスを文字列に変換するための「toString」メソッドが追加されます。
Mapでフィールドに設定するというのは、コンストラクタを記述しなかった場合だったと思ったのですが、引数なしのコンストラクタだったら設定していても設定できちゃう。
追記:2012/02/19 19:58 ごめんなさい。マップでフィールドの初期化を行うコンストラクタを使用できるのは引数のないコンストラクタだけが定義されている場合のみです。(プログラミングGroovy P.49より)
ただ、引数なしのコンストラクタが定義されている場合にこのような形式でインスタンスを生成しようとすると、引数なしコンストラクタが呼ばれているようです。
引数のMapはHashMapを受け取るコンストラクタに渡されて、デフォルトコンストラクタが呼ばれた後にプロパティに設定されているんですかね?
→ id:uehaj が回答してくれました!
「マップを引数に取るコンストラクタ」は生成されず、引数なしのコンストラクタでインスタンスを生成したのちに、マップを使って個々のプロパティを初期化していくコードがItemの外側で実行されるようです。