2011-12-24 5 views
3

可能性の重複:
Why can't enum constructors be protected or public in Java?Javaの列挙型内のコンストラクタをprivateに宣言するのはなぜですか?

次のコードは、単にJavaでenumの使用方法を示します。これは何の関係もなく、そのメンバーの値を集計するだけです。enum

package enumtest; 

enum Sum 
{   
    Pen(10),Pencil(15),Eraser(5); 

    private int value; 

    private Sum(int value) 
    { 
     this.value=value; 
    } 

    public int getValue() 
    { 
     return(value); 
    } 
} 

final public class Main 
{ 
    public static void main(String...args) 
    { 
     int sum=0; 

     for(Sum o:Sum.values()) 
     { 
      sum+=o.getValue(); 
     } 

     System.out.println("sum = "+sum); 
    } 
} 

これは、コンソール上sum = 30を表示します。ここでは1つの質問だけ。一般的に、クラスでは、コンストラクタはpublicと宣言されています。なぜ、enumのコンストラクタはprivateと宣言されますか?その他の修飾子publicprotectedは許可されていません。 publicと宣言しても、コンパイル時にエラーが発生します。どうして?

答えて

3

キーワードを付けずに宣言することもできます(例:ただSum(int value)

Java自体がさまざまなインスタンスを作成し、Singletons(Enumが正常に動作するために必要)として作成されるためです。 publicまたはprotectedは、他の呼び出し元によって同じ列挙型の追加インスタンスが作成されることを意味します。これは、Singleton保証を破る可能性があります。

+1

しかし、パッケージで保護された(修飾子なしの)コンストラクタは問題なく、基本的に同じ引数を使用できます。 – Voo

+5

通常のクラスのコンストラクタにアクセス修飾子が指定されていない場合、 。 * enum型*のコンストラクタにアクセス修飾子が指定されていない場合、コンストラクタは** private **になります。 * enum型*(§8.9)のコンストラクタが 'public'または' protected'と宣言されている場合、コンパイル時エラーです。 [§8.8.3]から http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.3 JLS。 – Lion

+0

上記はJava 6の言語仕様です。 Java 8仕様では、列挙型コンストラクタの可視性に関する情報は、[§8.9.2](http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls- 8.9.2)。 –

関連する問題