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
   }

}

当试图避免重复代码时,问题出现在第二个构造函数中。这是因为我不能在同一个构造函数中同时调用super()两者this()

我可以将通用代码提取到一个单独的方法中,但我确定这个问题必须有更优雅的解决方案?

4

2 回答 2

5

一种经常使用的模式是

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

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

但这仅在Panel()并且Panel(null)等效时才有效。

否则,通用方法似乎是最好的方法。

于 2013-01-09T20:53:59.423 回答
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 回答