2

私のコード:

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; //eclipse say Syntax error } expected


    mainFrame = new JFrame("mainFrame");
    mainPanel = new JPanel();
    button = new JButton("click me");
    area = new JTextArea(10, 15); 


}

解決策を見つけることはできませんが、恥ずかしいほど簡単だと思います:/

4

4 に答える 4

3

ここでの回答のほとんどは、初期化に初期値を使用できること、およびコンストラクターを使用できることを正しく指摘しています。ただし、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");
        }};
    }
}
于 2013-09-16T20:38:35.077 に答える