2013-01-09 207 views
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()

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

+0

如果你能更好地描述它,找不到这些词,请随时更新标题。 :-) – Zar

+1

大多数人都认为构造函数应尽可能简单......所以如果你的“东西”不仅仅是一些变量赋值,我会建议使用一种方法来提取公共代码。否则,也许初始化可能会做到这一点。 –

+0

@TillHelgeHelwig为什么?我的意思是除了保持任何尽可能简单的基本原则:) –

回答

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 
    } 

} 
+0

这只是其他两个答案的组合吗? – Kent

+1

似乎是这样,但当我开始写这个:)时没有答案。如果它有用,那么很好,如果不好的话,运气不好。 – Claudio

5

一种模式是

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

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

但是,只有当Panel()Panel(null)是等价的工作。

否则,常见的方法似乎是最好的方法。

+0

或者,您可以将新的FlowLayout()传递给此(LayoutManager管理器),而不是传递null,因为这是JPanel的默认值。 – splungebob

+0

@splungebob我真的不知道这些类,但我试图给出一个通用的解决方案 –