豆無日記スマートフォン用の表示で見る豆無日記この広告は、90日以上更新していないブログに表示しています。Almirayのセッションです。D'arcyの担当セッションだったんですが、なにやらの事情でAndresが担当することになったようです。Programmingというセッションが本来のメイン担当。そっちも聞いたので別途まとめます。今回は、Twitterに実況ならぬ感想戦(後でメモから起こしたダイジェストのツイート)してたので、それをはりつけながらちょっと補足していきます。Generationに行ってきた。GriffonコミッタのAalmiray氏。Rombokの紹介をちょっとだけした後は、Groovy自慢のターンでした。内容はよくまとまっていたけど、個人的には復習的な話だった。Lombok(RじゃなくてLでした)は、唐辛子がトレードマークのOSSプロジェクトです。http://projectlombok.org/Javaプログラミングで、おなじみのgetter/setterを書くのがメンドイけど、@Getter/@Setterアノテーションをフィールドにつけるとコンパイル時にバイトコードを生成してくれて、ソースコードにgetter/setterが最初から書いてあったかのようなclassファイルができあがる、という寸法。他にもいくつか品揃えがあります。知らないのですが、ぱっとみでは割と小規模なコードジェネレーションによる開発サポートツール、のようです。Lombokの紹介終わり。GroovyのASTTransformationは(使うのは)簡単かつ強力。@Delegateをフィールドにつけると、そのフィールドのクラスが持つ全メソッドに対する委譲メソッド群をコンパイル時に自動生成&展開してくれる。#javaonejpGroovyでは、1.6からAST変換による黒魔術が導入されました。Treeの略で、日本語では抽象構文木ですね。node)にそのオペランドを対応させたものである。葉は変数や定数に対応する。抽象構文木は構文解析で構文木とデータ構造の中間的なものとして使用される。コンパイラやインタプリタでのプログラムの内部表現として使われ、コンパイラ最適化やコード生成はその上で行われる。http://ja.wikipedia.org/wiki/%E6%8A%BD%E8%B1%A1%E6%A7%8B%E6%96%87%E6%9C%A8ということになります。AST変換を平たく言えば、とりあえずソースコードをパースしたけど内容を解釈する前の中間状態に対して、内容を自由に改ざんすることで、ソースコードで書いてなかったような実装を挿入したり、文法要素の意味を変更したりするような、まあ、いわゆる黒魔術です。1.8でもじわじわと増加中です。この後は、こんなのあるぜ!という自慢が続きます。@Lazyをフィールドにつけると、初めてアクセスするときに初期化するようなアクセサを生成してくれる。@Lazyで展開される実装はdouble-checked-lockingっぽい。スレッドセーフか?というツッコミに、多分Yes、といってたけど、Java5以降はね、という条件が必要だと思った。↑これが、コンパイルされたクラスの中では↓こうなります。会場からの質問で、当然のように「それってスレッドセーフ?」というツッコミが入ったのですけど、ちょっとキョドったような感じで「Yes」と流してしまいました。lockingが実用になるのってJDK5からなんで、それくらい触れてもいいのになーと思いました。今、改めて見てみると、なんとspeakersにvolatileが付いてない・・・・。これじゃスレッドセーフじゃないじゃん。実際にコンパイル&逆コンパイルしてみましょう。set$speakers(java.util.ArrayList);うーん。volatileついてない・・・。これじゃスレッドセーフじゃないですよねぇ。LazyアノテーションクラスのJavadocを見てみます。自前でvolatile追加しないとスレッドセーフじゃないと明言されてるじゃないですか。toString()が自動生成される等、色々がんばってきちんとImmutableにしてくれる。@Delegateフィールドに着けると、そのフィールドのオブジェクトの全メソッドに対する委譲メソッドを自動的に生成してくれる。@Log1.8から導入。ロギングのためのlogインスタンス変数を自動生成してくれる。log.debug("HOGE")とかですぐにロギングできる。isXxxxでレベルチェックもきちんとされるので、レベルをきちんと指定しておけば文字列生成のオーバヘッドもありません。これ、拙作のkobo-commonsの機能として実装しようかなーと思って調べたらちょうど本家で実装されてた、という裏話があります。