2010-12-11 143 views
1

我使用NetBeans的GUI設計器創建了一些JDialog,然後我從我自己的EditorDialog類繼承了子類。Java類初始化難題

我走得更遠之前,請考慮以下示例代碼:

class MyDialog extends EditorDialog { 
    private Color someVariableThatTheGuiNeeds = new Color(0,50,100); 

    public MyDialog() { 
     super(true); 
    } 

    //<auto-generated> 
    private void initComponents() { //note this is private! 
     //... 
    } 
    //</auto-generated> 
} 

abstract class EditorDialog extends JDialog { 
    public EditorDialog() { 
     super(null,true); 
    } 
    public EditorDialog(boolean stuffNeedsDone) { 
     super(null,true); 
     //initComponents(); 
     doStuffAfterGuiInitialized(); 
    } 
} 

的問題是,我無法從我的超調用initComponents(),因爲它是私有的。

要解決這個問題,我想一個解決方法的類:

//in EditorDialog 
public EditorDialog(boolean stuffNeedsDone) { 
    super(null,true); 
    workaround(); 
    doStuffAfterGuiInitialized(); 
} 
protected abstract void workaround(); 

//in MyDialog 
@Override 
protected void workaround() { 
    initComponents(); 
} 

,當然,這是不行的,因爲當initComponents()得到的,因爲這樣的所謂someVariableThatTheGuiNeeds尚未初始化初始化發生:

  • new MyDialog()
    • super(this)
      • EditorDialog(boolean)被稱爲
        • super(null,true)叫,JDialog做的東西
        • EditorDialog的實例變量初始化
        • workaround()
        • initComponents()
          • doSomethingWith(someVariableThatTheGuiNeeds) - >NullPointerException異常因爲someVariableThatTheGuiNeeds不初始化
    • NOWsomeVariableThatTheGuiNeeds因爲能見度壓倒一切只能變得更加公開,當初始化

而且,我不能創建在EditorDialog非私人抽象initComponents(), 。

那麼,我怎樣才能解決這個問題,而不會讓它變得太冒昧?

(如果你不熟悉的NetBeans,我不能編輯自動生成的代碼,並沒有選擇(即我能找到),以改變在initComponents()方法訪問修飾符。

回答

1

你的建設者不該」牛逼叫非private方法在任何情況下,如果您需要爲您的對話框初始化在創建之後,你可以創建一個init()方法構造完成後應調用。

注意,方法名doStuffAfterGuiInitialized()指示有點誤解,GUI甚至是實例,沒有完全初始化,直到構造函數完成之後。

0

這是java中常見的問題。 Instanciation不是子類的朋友。

許多人使用間接解決方案:一旦對象完全構建,調用init()方法。

這通常通過工廠自動化。所有的注入框架(如Spring)都會按常規做到這一點。