Cotton Bolls: Type Safe Enumパターンの謎のクラス
« 期待値のデータ構造の作成 | トップページ | アスペクト指向のデザインパターン的解釈 »
2004.01.18
Type Safe Enumパターンの謎のクラス
Type Safe Enumパターンで最近ハマった.下のクラスをコンパイルすると,なぜかOuter$1.classという謎のクラスファイルができてしまう.
public class Outer { public class Enum { private Enum() {} } public Enum ONE = new Enum(); public Enum TWO = new Enum(); public Enum THREE = new Enum(); }
無名クラスを使ってないのに,どうしてOuter$1.classができるのか不思議だった.jadで解析するとjavacが次のように解釈していることがわかる.
public class Outer { static class ??? {} public class Enum { private Enum() {} Enum(??? o) { this(); } } public Outer() { ONE = new Enum(null); TWO = new Enum(null); TREE = new Enum(null); } public Enum ONE; public Enum TWO; public Enum THREE; }
ここでOuter$1クラスを???とした.つまり,Outer.Enumクラスのコンストラクタはprivateなので,外のクラスOuterがアクセスするために別のコンストラクタが作られ,このOuter$1クラスはシグニチャを一意にするために用意された無名クラスということだろう.試しにOuter.Enumクラスのコンストラクタからprivateをとると無名クラスは生成されなかった.
public class Outer { public class Enum { Enum() {} } public Enum ONE = new Enum(); ... }
なぜこんなことで悩んでいたかというと,EclipseのコンパイラではOuter$1.classが生成されず,SunのSDKでは生成されていたからだった.EclipseのコンパイラはJDKと違うclassファイルを吐くらしい.ビルドの方法を移行中に余計なクラスファイルができていることに気付いたため,しょうもないことで一日悩んでしまった.またバッドノウハウが増えてしまったなあ.
08:07 PM in Java | 固定リンク
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/113432
この記事へのトラックバック一覧です: Type Safe Enumパターンの謎のクラス: