2009-09-04 17 views
10

Javaでは、列挙定数のコンストラクタはいつ呼び出されますか?

私は次のテスト/ドライバコードを持っています:

public static void main(String args[]){ 
    System.out.println(Commands.Save.getShortCut()); 
} 
質問: Javaの場合、コンストラクタはいつですか?列挙定数は呼び出されましたか?上記の例では、 Saveの列挙定数のみを使用しています。これは、コンストラクタが Saveのみを作成するために一度呼び出されることを意味しますか?あるいは、 SaveFileの両方が一緒に構築されますか?

答えて

11

enumクラスが初期化されると、コンストラクタが呼び出されます。どのメンバーが実際に参照されて使用されているかにかかわらず、各コンストラクターがメンバー宣言の順序で呼び出されます。

+0

'ClassLoader'がクラスをロードすると、enumのコンストラクタが呼び出されますか? SaveやFileのようなアクセスしているメンバがコンストラクタを呼び出しますか?引数のコンストラクタがないとどうなりますか? –

+0

@MuhammadBabarクラスを初期化せずにロードすることができます。したがって、いいえ、クラスが初期化されると、各メンバーが構築されることを意味します。そして、私が言ったように、メンバーが参照されているかどうかは問題ではありません。クラスの初期化時に構築されます。あなたの2番目の質問は明確ではありません。メンバーに引数が指定されていない場合は、引数なしのコンストラクタが定義されている必要があります。そうでない場合は、enumはコンパイルされません。それはあなたが意味することですか? – erickson

+0

しかしenumでは、新しいSomeEnum()を明示的に行うことはありません。私の場合、enumには1つの変数、つまり* instance *とargsのないprivateコンストラクタしかありません。このコンストラクタはいつ呼び出されますか? –

3

static() {...}メソッドと同様、コンストラクタはEnumクラスが最初に初期化されるときに呼び出されます。 Enumのすべてのインスタンスは、anyが使用される前に作成されます。このサンプルで

public static void main(String args[]){ 
    System.out.println(Commands.Save.getShortCut()); 
} 

Save.getShortCut()が呼び出される前に、SaveFileの両方のctorのは、完了しています。

これらは、コードで宣言されているように、順次呼び出されます。

2

どちらもクラスの初期化時に作成されます。静的な初期化子の前にこれが行われるので、これらの列挙型を静的ブロックで使用できることを指摘したいと思います。

関連する問題