継承したコードをリファクタリングしているのですが、設計上の決定に困惑してしまい、Google で検索しても適切な用語がわかりません。私の前任者は次のようなブロックを使用していました。
public class ChildClass extends ParentClass {
{
inheritedVar = "someVal";
}
public ChildClass(){ /* constructor exists */ }
// rest of code
}
キーワードなしでコードブロックを宣言する意味は何ですか?静的ブロックのようには動作しないと思います。コンストラクタで設定する代わりになりますか?ファクトリが使用されている場合(この場合は使用されていません)に何らかの効果がありますか?関連するスレッドがここに見つかりました。Cでこれが起こっているしかし、その理由 (スコープと変数の宣言) は Java には関係ないように思われます。
この「理由」についてのご意見やアイデアがあれば、ぜひお聞かせください。これをリファクタリングするのは簡単ですが、現時点ではただ興味があるだけです。
ベストアンサー1
これは初期化ブロックです。(静的初期化ブロックに関連) このページのインスタンス メンバーの初期化を参照してください。
http://download.oracle.com/javase/tutorial/java/javaOO/initial.html
これはコンストラクターの代替です。コードを共有する方法として、複数のオーバーロードされたコンストラクターを提供する場合に使用できます。
ただし、個人的には、匿名コード ブロックに頼るよりも、コンストラクターが名前付き初期化メソッドを呼び出す方がはるかに明確だと思います。ただし、コンパイラはバックグラウンドで初期化ブロックをすべてのコンストラクターにコピーするため、メソッド宣言をインライン化するのと同様にパフォーマンスが向上すると主張することもできます。