home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

Groovy/Enum型を使う時はGroovyのバージョンに注意

Groovy/Enum型を使う時はGroovyのバージョンに注意

Groovy / Enum型を使う時はGroovyのバージョンに注意
id: 1231 所有者: msakamoto-sf    作成日: 2013-08-10 19:56:15
カテゴリ: Groovy 

JavaのEnumと、その魅力的な機能はGroovyでも使えます。

JavaでのEnum参考:

しかし、GroovyでJavaのenumを使う場合、特に変態的な凝った組み合わせを導入し始めると(例:コンストラクタのカスタマイズ、メソッドのオーバーライドなど)、Groovyのバージョンによっては期待通りに動作しないケースがありました。その辺りを簡単にメモします。

まず、codehausにあるような超単純なenumの使用方法では特に問題なくGroovyでも使えます。コンストラクタをカスタマイズしてる例もありますが、まだenumインスタンスごとの初期化ブロックは無いので、偶然にも地雷を回避できています。

しかし、2010年ごろになるとJavaのenumの変態的な機能に魅了されたGroovierが、「これってGroovyでも出来るんじゃ・・・」と試した結果、残念な結果に終わる報告が出てきます。

まあこの辺は、1.8で大体直されてるので可愛いものです。

初期化ブロック中の";"とか"(", ")"のような些細な問題は 1.8 で解決されましたが、enumに抽象メソッドを導入してインスタンスごとに実装させるとか、enum中のメソッドをインスタンスごとにオーバーライドしようとするとか始めると、2.0/2.1の初期バージョンでは期待通りに動いてくれなかったようです。

この辺は、2.0.8 / 2.1.3 になってようやく解決されています。

プロジェクトによってはGroovyのバージョンをドラスティックに上げられない場合もあると思います。マイナーバージョンアップで 1.8.9 まで上げられたとして、上記のような凝ったenumを使おうとするのであれば、以下の様な回避策があると思います。1.8.9 で動作確認済みです。

  • https://gist.github.com/msakamoto-sf/6175058
    • ポイント:enumのstaticブロックを利用して、staticインスタンスのmetaClassを使って動的にメソッドを設定している。
    • 抽象メソッドは、1.8.9だとabstract指定がまだ使えないので、ひとまずUnsupportedOperationException()を投げるようにしておく。(ダミーでも良いので入れておかないと、GreetEnum型の参照からのメソッド呼び出しが解決できない。)

結論:enumの変態的な特徴をフルに使いたいのであれば最新版のGroovyを使いましょう。

ただ、個人的にはenumの変態的な特徴に依存したデザインにするのは、単に言語の特徴に悪ノリしただけのような気もしますので、あんまりそれに依存し過ぎないよう、調整したほうが良い気もしました。(他の言語と比べて特出した特徴に依存し過ぎると、黒魔術化してメンテナンスが悪くなる可能性があるので、それを避けたい。)



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2013-08-10 20:01:26
md5:4a5e204ec762c511253441dd62900aa9
sha1:f54680c324232f89e067326f9f536bf94115b80d
コメント
コメントを投稿するにはログインして下さい。