#navi_header|Groovy| JavaのEnumと、その魅力的な機能はGroovyでも使えます。 JavaでのEnum参考: - Enum Types (The Java™ Tutorials > Learning the Java Language > Classes and Objects) -- http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html - 【改訂版】Eclipseではじめるプログラミング(21):7ステップで理解するJavaでの列挙型/enum使用法 (1/3) - @IT -- http://www.atmarkit.co.jp/ait/articles/1103/03/news107.html - JavaのEnumが謎の機能になってた - namutakaの日記 -- http://d.hatena.ne.jp/namutaka/20100228/1267365554 - enumをもうちょっと使う - しげるメモ -- http://d.hatena.ne.jp/ashigeru/20090119/1232365391 - Effective Java 読書会 8 日目 「それ enum で出来るよ」 - IT戦記 -- http://d.hatena.ne.jp/amachang/20100225/1267114471 しかし、GroovyでJavaのenumを使う場合、特に変態的な凝った組み合わせを導入し始めると(例:コンストラクタのカスタマイズ、メソッドのオーバーライドなど)、Groovyのバージョンによっては期待通りに動作しないケースがありました。その辺りを簡単にメモします。 まず、codehausにあるような超単純なenumの使用方法では特に問題なくGroovyでも使えます。コンストラクタをカスタマイズしてる例もありますが、まだenumインスタンスごとの初期化ブロックは無いので、偶然にも地雷を回避できています。 - Groovy - Using Enums -- http://groovy.codehaus.org/Using+Enums しかし、2010年ごろになるとJavaのenumの変態的な機能に魅了されたGroovierが、「これってGroovyでも出来るんじゃ・・・」と試した結果、残念な結果に終わる報告が出てきます。 - enumはインスタンスベースオブジェクト指向の夢を見るか - uehaj's blog -- http://uehaj.hatenablog.com/entry/20100305/1267765434 - JavaのEnumが謎の機能になってた - namutakaの日記 -- http://d.hatena.ne.jp/namutaka/20100228/1267365554 まあこの辺は、1.8で大体直されてるので可愛いものです。 - [#GROOVY-3986] can't omit toplevel parentheses in enum element method - jira.codehaus.org -- http://jira.codehaus.org/browse/GROOVY-3986 - [#GROOVY-3985] error in instance initializer for Enum element, without special method - jira.codehaus.org -- http://jira.codehaus.org/browse/GROOVY-3985 初期化ブロック中の";"とか"(", ")"のような些細な問題は 1.8 で解決されましたが、enumに抽象メソッドを導入してインスタンスごとに実装させるとか、enum中のメソッドをインスタンスごとにオーバーライドしようとするとか始めると、2.0/2.1の初期バージョンでは期待通りに動いてくれなかったようです。 - [#GROOVY-4641] Defining an abstract method in enum - jira.codehaus.org -- http://jira.codehaus.org/browse/GROOVY-4641 - [#GROOVY-6065] Overriding enum methods in constant specific body does not work if non-default constructor is used - jira.codehaus.org -- http://jira.codehaus.org/browse/GROOVY-6065 この辺は、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の変態的な特徴に依存したデザインにするのは、単に言語の特徴に悪ノリしただけのような気もしますので、あんまりそれに依存し過ぎないよう、調整したほうが良い気もしました。(他の言語と比べて特出した特徴に依存し過ぎると、黒魔術化してメンテナンスが悪くなる可能性があるので、それを避けたい。) #navi_footer|Groovy|