groovyでenumをネストするようにするとコンパイルが終わらない場合がある。
まともやenumにハマりました。
前回ハマったのはこれ → enumの抽象メソッドはgroovyでサポートされてない? #jggug #q - 旧山pの楽しいお勉強生活
現象
↓のコードはコンパイルが終わりません。
public enum EnumSample { HOGE() public enum NestEnum { HUGA } }
c:\work\20130201>dir <略> c:\work\20130201 のディレクトリ 2013/02/01 19:55 <DIR> . 2013/02/01 19:55 <DIR> .. 2013/02/01 19:55 94 EnumSample.groovy <略> c:\work\20130201>groovy -version Groovy Version: 2.1.0 JVM: 1.7.0_11 Vendor: Oracle Corporation OS: Windows 7 c:\work\20130201>groovyc EnumSample.groovy
特に何が出るわけでもなく反応が返ってこないだけなので、30分程待ってみましたがコンパイルは終わりませんでした。
回避方法
public enum EnumSample { HOGE(); public enum NestEnum { HUGA } }
c:\work\20130201>dir <略> c:\work\20130201 のディレクトリ 2013/02/01 20:25 <DIR> . 2013/02/01 20:25 <DIR> .. 2013/02/01 20:17 95 EnumSample.groovy <略> c:\work\20130201>groovyc EnumSample.groovy c:\work\20130201>dir <略> c:\work\20130201 のディレクトリ 2013/02/01 20:25 <DIR> . 2013/02/01 20:25 <DIR> .. 2013/02/01 20:25 6,543 EnumSample$NestEnum.class 2013/02/01 20:25 6,617 EnumSample.class 2013/02/01 20:17 95 EnumSample.groovy <略> c:\work\20130201>
もちろんgroovycで発生するということはgroovyconsoleやらIDEでも発生するわけで。
前回のようにコンパイルエラーになるならともかく、コンパイルで固まっちゃうとIDEで実行してるとIDEを落とさなければなりません。
しかも、Eclipseの場合、ゴミが残るのか起動時にエラーが発生します。
--------------------------- Eclipse --------------------------- エラーが発生しました。 ログ・ファイル C:\workspace\.metadata\.log を参照してください。 --------------------------- OK ---------------------------
「workspace\.metadata\.log」には大量のerrorが出ています。(1600行位出てました)
適当に検索したらGroovyPluginという文字がありました。
<Errorは略> !ENTRY org.eclipse.core.resources 4 566 2013-02-01 16:40:57.484 !MESSAGE ワークスペースが正しく初期化されていません、またはすでにシャットダウンされています。
ちなみに解決するには「-clean」を付けて実行すればOKかと思います。
(ソースが保存されているとコンパイルしようとしてまたフリーズするので、ダメな場合は直接ソースを編集して下さい。)