1

重複の可能性:
「この」参照は構築中にエスケープしますか?

コンストラクターの問題でこれをリークすることがこのインスタンスに適用されるかどうかを知りたいのですが、コンストラクターはその構築を完了するためにsetJMenuBar()メソッドを呼び出す必要があると考えているため、クラスの実装は次のとおりです。

public class StaffManagerMainWindow extends JFrame implements ActionListener {

    public StaffManagerMainWindow(String title, Image icon) throws HeadlessException {
        ...
        setJMenuBar();
    }

    private void setJMenuBar() {
        ...
        exitItem.addActionListener(this);
        ...
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
4

2 に答える 2

3

コンストラクターにリークがあると思います。オブジェクトの完全な初期化の前に「this」を渡しています。

于 2012-04-25T15:23:24.147 に答える
1

thisプログラムがマルチスレッドの場合、コンストラクターでのリークが問題になる可能性があります。これは、コンストラクターが終了する前に別のスレッドから actionPerformed() を呼び出す可能性がある exitItem に渡されます。これはOKではありません。特に画像にサブクラスを追加すると、プログラムが本当にひどく壊れる可能性があります。

代わりに init() メソッドとファクトリ メソッドを作成します。

public class StaffManager {
    public static StaffManager create() {
        StaffManager staffManager = new StaffManager();
        staffManager.init();
        return staffManager;
    }

    private StaffManager() {
    }

    private void init() {
        // Add listeners here.
    }
}

編集: Swing オブジェクトは常にイベント ディスパッチ スレッドで作成されるためthis、この場合、リークは影響しません。それにもかかわらず、私はそれをしない方が好きです。

于 2012-04-25T15:38:35.623 に答える