1

以下に示すように、Java がオブジェクト初期化ブロックをサポートしていることは知っています。次のコードは、TestObjectInitialize インスタンスが作成されたときにオブジェクト初期化ブロックが常に呼び出されることを示しています。

public class TestObjectInitialize {

    public int abc;

    //object initialize block
    {
      abc= 5;
    }

    public TestObjectInitialize() {

    }


    public static void main(String... args) {
          TestObjectInitialize toi = new TestObjectInitialize();
          System.out.println(toi.abc);
    }

}
4

3 に答える 3

4

私は人々がこれを行うのを見てきました:

Map<String, String> map = new HashMap<String, String>() {{
    put("key1", "value1");
    put("key2", "value2");
}};

メソッドがある場合に役立ちます

class Init {
    static int initFoo(Map<String, String> map) {
        // ...
    }
}

次のように呼び出すことができます。

class FooBar {
    static int foo = Init.initFoo(new HashMap<String, String>() {{
                        put("key1", "value1");
                        put("key2", "value2");
                     }});
}
于 2013-01-31T10:08:32.673 に答える
2

私はstaticそれの変種を数回使用しました。たとえば、クラス内のコレクションを初期化するために使用できます。

static List<String> words = new ArrayList<String>();
static {
    words.add("foo");
    words.add("bar");
}

これの主な利点は、宣言と初期化を同じ場所に保持できることです。非静的初期化子には、コンストラクターをチェーンする必要なく、すべてのコンストラクターに対して実行されるという利点があります。

public class Foo {
    int value;
    {
        value = getDefaultValue();
    }

    public Foo() {
    }
    public Foo(String something) {
    }

}

value = getDefaultValue()使用されている ctor に関係なく実行されます。

于 2013-01-31T10:16:05.983 に答える
1

Java で Object initialize ブロックを実際に使用している人はいますか?

答えはイエスです。今の質問はなぜですか?
それらを設定するためにプログラミングロジックを必要とする可能性のある最終変数がある場合。なぜなら、コンストラクターが呼び出される前に最終変数を設定する必要があり、これを行う唯一の方法は、宣言中にハードコードされた値に設定するか、初期化ブロック内に設定することです。ただし、コンストラクターでも実行できますが、クラスで複数のコンストラクターが定義されている場合はどうなりますか?? 次に、コードの冗長性につながるすべてのコンストラクターでその最終変数を初期化する必要があります。詳細については、こちらこちらをご覧ください。

これはJavaのどこかで使用されましたか?

今まで Java のどの API でも見たことがありません。しかし、ほとんどの場合、次のようなコードで使用します。

private final Set<String> VALID_CODES = new HashSet<String>() {{
    add("XZ13s");
    add("AB21/X");
    add("YYLEX");
    add("AR2D");
 }};
于 2013-01-31T11:50:14.107 に答える