5

コンストラクター内でスレッドを開始することがなぜ良い考えではないのか、スタック オーバーフローに関する質問があります。私は、コンストラクターから EventListener を発行することも、同じ理由で悪い考えであると読みました。「これ」がエスケープできる他のパターンにはどのようなものがあるのでしょうか?

4

1 に答える 1

4

コンストラクターからオブジェクトのインスタンスメソッドを呼び出すthisと、そのmathodにリークします。これは、そのメソッドが制御下にあり(パブリックにオーバーライドできない)、それからさらにリークしないようにしている限り、問題ない可能性がありますthis。もちろん、任意のメソッドの引数として使用thisすることは、より明示的な変形であり、それはあなたが言うときに起こりますx.addEventListener(this)。あまり明白ではないので、おそらくもっと陰湿な方法は、それ自体を引数としてthis使用するのではなくthis、内部/ローカル/匿名クラスのインスタンスを使用することです。

public class Main 
{
  private class MyListener extends MouseAdapter { ...}

  public Main() {
    class Listener1 extends MouseAdapter { ... }
    someSwingComponent.addMouseListener(new MyListener()); // inner class
    someSwingComponent.addMouseListener(new Listener1()); // local class
    someSwingComponent.addFocusListener(new FocusAdapter() { ... }); // anonymous
  }
}

これらすべての場合においてthis、メソッド引数として渡されるオブジェクトの囲みインスタンスになります。一方、staticネストされたクラスを宣言する場合、それを囲むインスタンスはありません。

于 2012-06-30T13:52:25.400 に答える