0

次のようなユーティリティクラスがあります。

public final class MyUtils {

     public static final List<String> MY_VALUES = new ArrayList<String>();

     {
         MY_VALUES.add("foo");
         MY_VALUES.add("bar");
     }
}

私はこれを次のように別のクラスから呼び出します。

MyUtils.MY_VALUES

そうすると、リストは空になり、デバッグすると、静的ブロックが実行されないことがわかります。

静的クラスの初期化はいつ発生しますか?クラスを強制的に初期化する方法は?ブロックはa static field of the class is assigned、私がすぐに実行するときに実行する必要があります。また、条件""を満たすために変数を非最終にしようとしましたa non-constant static field is used

他の2つの質問とalsで推測されているように、initメソッドを使用できます。静的なコードブロックが実行されないのはなぜですか?しかし、言語仕様の条件を満たしているように見えますが、そもそもなぜ機能しないのかを理解したいと思います。

4

1 に答える 1

8

staticブロックを静的にするには、ブロックの前にキーワードを追加する必要があります。

public final class MyUtils {

     public static final List<String> MY_VALUES = new ArrayList<String>();

     static {
         MY_VALUES.add("foo");
         MY_VALUES.add("bar");
     }
}

クラスが構築されるたびに、初期化ブロックが呼び出されます。

静的初期化ブロックは、プログラムの開始時に1回だけ呼び出されます。

于 2013-03-27T01:07:57.503 に答える