ここでの回答のほとんどは、初期化に初期値を使用できること、およびコンストラクターを使用できることを正しく指摘しています。ただし、Java チュートリアルのInitializing Fieldsでは、実際にはフィールドを初期化するコンストラクター以外の方法が2 つ説明されています。(ii) 初期化ブロック。
次のコードは、3 つのメソッドすべてを示しています (インスタンスと静的初期化ブロックの両方を示しています)。
public class InitializationExample {
private int field1 = 1; // in-line initializer
private int field2a;
private static int field2b;
private int field3;
{
field2a = 3; // instance initializer
}
static {
field2b = 3; // static initializer
}
public InitializationExample( final int field3 ) {
this.field3 = field3;
}
}
初期化ブロックを使用すると、コードに非常に小さな変更を加えてコンパイルすることができます。
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.*;
public class TAFrame {
private JFrame mainFrame;
private JPanel mainPanel;
private JButton button;
private JTextArea textArea;
{
mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15);
}
}
これは可能ですが、信じられないほど一般的ではないため、これを使用する特に正当な理由がない限り、または作業中のコードベースで既に一般的である場合を除き、初期値またはコンストラクターはおそらくより読みやすく、保守しやすいものです。オプション。12.5によると、注意することも重要です。Java 言語仕様からの新しいクラス インスタンスの作成、インスタンス初期化コード (および初期値) は、コンストラクター コードが実行される前に処理されます。
コンストラクター ベースのメソッドに対する初期化ブロック アプローチには、考えられる利点が 1 つあります。これをコンストラクターにした場合、次の行に沿って
public TAFrame() {
mainFrame = new JFrame("mainFrame");
mainPanel = new JPanel();
button = new JButton("click me");
area = new JTextArea(10, 15);
}
後でいくつかの引数を取る別のコンストラクターを導入した場合、そのコンストラクターからゼロ引数のコンストラクターを明示的に呼び出す (コンストラクター チェーン) か、そのコンストラクターにも初期化代入を含める必要があります。初期化ブロックを使用すると、どちらも行う必要はありません。
初期化ブロックは、匿名サブクラスのインスタンスを作成するときにも便利です。これは、初期化コードを視覚的にクラスの "内部" に保持できるためです。詳細については、二重ブレースの初期化を読むことができますが、簡単な例を次に示します。
import java.util.HashMap;
import java.util.Map;
public class MapInitializationExample {
public static void main(String[] args) {
// initialization code for this Map is visually "inside" the map
final Map<Integer,String> numberNames = new HashMap<Integer,String>() {{
put(1,"one");
put(2,"two");
put(3,"three");
}};
}
}