2013-01-09 60 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我真的不知道這些類,但我試圖給出一個通用的解決方案 –