26

この種のコードをJavaで有効にする理由は何ですか?それは特定の理由で存在しますか、それとも他のJava言語設計の決定の副産物にすぎませんか?コンストラクターを使って同じ効果を出すことはできませんか?

class Student
{
    {
        System.out.println("Called when Student class is instantiated.");
    }
}
4

4 に答える 4

48

1 つのポイントは、どのコンストラクターが呼び出されても実行されることです。いくつかのコンストラクターがあり、それらが互いに呼び出さない場合 (何らかの理由で、たとえば、それぞれが直接対応するスーパークラス コンストラクターを呼び出したい場合など)、これは、コンストラクターを配置せずに、すべてのコンストラクターに対して同じコードが実行されるようにする 1 つの方法です。他の場所で呼び出すことができるメソッド。

また、匿名クラスを作成する場合にも役立つ可能性があります。コンストラクターは作成できませんが、初期化ブロックは作成できます。たとえば、これが JMock テストに使用されているのを見てきました。

于 2011-03-04T16:24:10.217 に答える
20

これは初期化ブロックと呼ばれます。

Java コンパイラは、イニシャライザ ブロックをすべてのコンストラクタにコピーします。したがって、このアプローチを使用して、複数のコンストラクター間でコードのブロックを共有できます。

于 2011-03-04T16:24:37.293 に答える
5

これは初期化ブロックです。Matt Ball が述べたように、それらは各コンストラクターにコピーされます。

静的初期化ブロックについて知りたいと思うかもしれません(Matt のリンクも参照)。

public class Foo {
    static {
        System.out.println("class Foo just got initialized!");
    }

    {
        System.out.println("an instance of Foo just got initialized!");
    }
}
于 2011-03-04T16:48:44.230 に答える
5

それはinit blockと呼ばれます。このようなブロックでは、すべての構造で同じロジックを実行でき、同じフィールドの宣言初期化を分離することもできます。

updともちろん、二重ブレースの初期化など

List<Integer> answers = new ArrayList<Integer>(){{add(42);}}
于 2011-03-04T16:25:27.210 に答える