2017-09-25 6 views
1

に列挙型のコンストラクタにアクセスする方法を、私は列挙型はJavaで内部的に実装されている方法を知っていただきたいと思い、私は以下の例で上記doesnotよう列挙型が内部的に実装されている方法とJava

public enum MyEnum { 
    MyEnum(){ 
    System.out.println("HelloWorld"); 
    } 
} 

をしようとしていますコンパイルエラーをスローするMyEnum()コンストラクタを呼び出す方法を知りたい。

+0

コンストラクタは、enumインスタンスが作成されるときに呼び出されます。列挙型の中にいくつかのインスタンスを宣言すると、それぞれがコンストラクタを呼び出します。 – khelwood

+1

あなたはそれを呼び出す必要はありません。メンバーの初期化時に自動的に呼び出されます。現在メンバーがいないので、決して呼び出されません。あなたが何を求めているのか不明です。 – EJP

答えて

4

列挙型のコンストラクタは、パッケージプライベートまたはプライベートアクセスでなければなりません。列挙体の先頭に定義されている定数が自動的に作成されます。 enumコンストラクタを自分で呼び出すことはできません。

コンストラクタにその列挙型の外部からアクセスすることはできません。実際にはenum定数を定義してアクセスできます。列挙の詳細例について

public enum Planet { 

    MERCURY (3.303e+23, 2.4397e6), 
    VENUS (4.869e+24, 6.0518e6), 
    EARTH (5.976e+24, 6.37814e6), 
    MARS (6.421e+23, 3.3972e6), 
    JUPITER (1.9e+27, 7.1492e7), 
    SATURN (5.688e+26, 6.0268e7), 
    URANUS (8.686e+25, 2.5559e7), 
    NEPTUNE (1.024e+26, 2.4746e7); 

    private final double mass; 
    private final double radius; 

    Planet(double mass, double radius) { 
     this.mass = mass; 
     this.radius = radius; 
    } 
} 

参照:

https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
2

は、Javaは、その基本クラスとしてjava.lang.Enumを拡張するクラスのようenum実装。その機能のほとんどは、特にオペレータnewenumクラスをインスタンス化できないこと、そしてenumの値が正しく構成されていることを確認するJavaコンパイラのサポートから得られます。

あなたがそれに対して少なくとも1つのenum値を追加し、呼ばMyEnumのコンストラクタを確認したい場合は、次の

public enum MyEnum { 
    VALUE1; 
    MyEnum(){ 
     System.out.println("HelloWorld"); 
    } 
} 

注:あなたもenumの 『非合法』のインスタンスを作成するためにリフレクションを使用することができますがそれは、enumメンバーシップについての前提を壊すので、プロダクションのような設定では実行しないでください。

0

enumは、シングルトンの一般化であり、各定数に対して1つのインスタンスを提供する特別なクラスです。内部的には、フィールドはenumと同じタイプのpublic static finalとして扱われ、定義されています。また、enumのコンストラクタはprivateと扱われるため、MyEnum()コンストラクタをenum MyEnumの外部から呼び出すことはできません。コンストラクタは、定数にいくつかのプロパティを付加したい場合に使用されます。例えば、以下の考慮:

public enum MyEnum { 
    VAL_A("First Value"), 
    VAL_B("Second Value"); 

    private final String fullName; 

    MyEnum(String fullName){ 
     this.fullName = fullName; 
    } 

    public String getFullName() { 
     return fullName; 
    } 
} 

その後、私たちはクラスの概念を使用して内部的に実装されMyEnum.VAL_A.getFullName();

0

列挙型のようなものを行うことができます。すべてのenum定数は、暗黙的にpublic static finalとして宣言されます。 Enum定数は静的なので、enum-nameを使用してアクセスできます。例えば

:すべての列挙定数が自動的にクラスのロード時に作成され、したがって、コンストラクタは列挙時に実行される

final class Color extends java.lang.Enum { 
    public static final Color Red = new Color(); 
    public static final Color Green= new Color(); 
    public static final Color Blue= new Color(); 
} 

enum Color{ 
    Red,Green,Blue; 
} 

が内部として実装されていますすべての列挙定数に対してクラスローディング。enumオブジェクトを明示的に作成することはできないため、コンストラクタを直接呼び出すことはできません。

関連する問題