Enumのインスタンス化は列挙子単位
Enumのインスタンス化はクラス単位ではなく、列挙子単位で行われる。
次のような列挙子(A, B, C)を持つEnumを使用すると、「A, B, C」3つのSample型のインスタンスが生成される。
public enum Sample {
A, B, C
}
具体的には、以下のようにSample.Aを呼び出すことで、「A, B, C」3つのインスタンスが生成される。
public class Main {
public static void main(String[] args) {
Sample sample = Sample.A;
}
}
呼び出しているのはSample.A
のみだが、Sample型のインスタンスとして生成されるのはEnumに定義されている全ての列挙子(A, B, C)となる。
Enumのインスタンスが生成されるのは1回だけ
列挙子を使用するタイミングで毎回インスタンスが生成される場合、次のコードの結果は「false」になるはずだが、実際には「true」が返ってくる。
public class Main {
public static void main(String[] args) {
sample(Sample.A); // ここでインスタンスが生成される
}
private static void sample(Sample sample) {
System.out.println(Sample.A == sample); // ここではインスタンスが生成されない
}
}
独自に定義したEnumをコンパイルすると、コンパイラによって自動的に追加されるstatic初期化子の中で各列挙子のインスタンスが生成され、staticフィールドに代入されるらしい。
参考