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 で動作確認済みです。
結論:enumの変態的な特徴をフルに使いたいのであれば最新版のGroovyを使いましょう。
ただ、個人的にはenumの変態的な特徴に依存したデザインにするのは、単に言語の特徴に悪ノリしただけのような気もしますので、あんまりそれに依存し過ぎないよう、調整したほうが良い気もしました。(他の言語と比べて特出した特徴に依存し過ぎると、黒魔術化してメンテナンスが悪くなる可能性があるので、それを避けたい。)