我使用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
不初始化
- NOW
someVariableThatTheGuiNeeds
因爲能見度壓倒一切只能變得更加公開,當初始化
而且,我不能創建在EditorDialog
非私人抽象initComponents()
, 。
那麼,我怎樣才能解決這個問題,而不會讓它變得太冒昧?
(如果你不熟悉的NetBeans,我不能編輯自動生成的代碼,並沒有選擇(即我能找到),以改變在initComponents()
方法訪問修飾符。