0

次のクラスについて考えてみます。

class MyPanel extends JPanel {

   public MyPanel() {
      super();

      // Do stuff
   }

   public MyPanel(LayoutManager manager) {
      super(manager);

      // Do same stuff as the first constructor, this() can't be used
   }

}

重複コードを回避しようとすると、2番目のコンストラクターで問題が発生します。これは、同じコンストラクターでとの両方super()を呼び出すことができないためです。this()

共通のコードを別のメソッドに抽出することはできますが、この問題にはもっと洗練された解決策があるはずです。

4

2 に答える 2

5

複数のコンストラクターを呼び出すことはできませんが、実行できることは次のようなものです。

class MyPanel extends JPanel {

  public MyPanel() {
     this(null);
  }

  public MyPanel(LayoutManager manager) {
     super(manager);
     // Do all the stuff
  }

}

しかし、あなたはもっと厄介なことになってしまうかもしれません。あなたが言ったように、初期化メソッドは行く別の方法である可能性があります:

class MyPanel extends JPanel {

  public MyPanel() {
     super();
     this.initialize();
  }

  public MyPanel(LayoutManager manager) {
     super(manager);
     this.initialize();
     // Do the rest of the stuff
  }

  protected void initialize() {
     // Do common initialization
  }

}
于 2013-01-09T20:57:15.717 に答える
5

よく使われるパターンは、

class MyPanel extends Panel {
  MyPanel() {
    this(null);
  }

  MyPanel(LayoutManager manager)
    super(manager);
    // common code
  }
}

しかし、それはPanel()Panel(null)が等しい場合にのみ機能します。

それ以外の場合は、一般的な方法が最善の方法のようです。

于 2013-01-09T20:53:59.423 に答える