この種のコードをJavaで有効にする理由は何ですか?それは特定の理由で存在しますか、それとも他のJava言語設計の決定の副産物にすぎませんか?コンストラクターを使って同じ効果を出すことはできませんか?
class Student
{
{
System.out.println("Called when Student class is instantiated.");
}
}
この種のコードをJavaで有効にする理由は何ですか?それは特定の理由で存在しますか、それとも他のJava言語設計の決定の副産物にすぎませんか?コンストラクターを使って同じ効果を出すことはできませんか?
class Student
{
{
System.out.println("Called when Student class is instantiated.");
}
}
1 つのポイントは、どのコンストラクターが呼び出されても実行されることです。いくつかのコンストラクターがあり、それらが互いに呼び出さない場合 (何らかの理由で、たとえば、それぞれが直接対応するスーパークラス コンストラクターを呼び出したい場合など)、これは、コンストラクターを配置せずに、すべてのコンストラクターに対して同じコードが実行されるようにする 1 つの方法です。他の場所で呼び出すことができるメソッド。
また、匿名クラスを作成する場合にも役立つ可能性があります。コンストラクターは作成できませんが、初期化ブロックは作成できます。たとえば、これが JMock テストに使用されているのを見てきました。
これは初期化ブロックと呼ばれます。
Java コンパイラは、イニシャライザ ブロックをすべてのコンストラクタにコピーします。したがって、このアプローチを使用して、複数のコンストラクター間でコードのブロックを共有できます。
これは初期化ブロックです。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!");
}
}
それはinit blockと呼ばれます。このようなブロックでは、すべての構造で同じロジックを実行でき、同じフィールドの宣言と初期化を分離することもできます。
updともちろん、二重ブレースの初期化など
List<Integer> answers = new ArrayList<Integer>(){{add(42);}}