2011-03-22 30 views
6

我有一個必須用參數構造的基類。在子類中,我需要在構造基類之前準備好這個參數,但是在Java之前,必須先調用超類。處理這種情況的最佳方式是什麼(請參見下面的簡單示例)。爲超級構造函數準備參數

class BaseClass { 
    protected String preparedParam; 

    public BaseClass(String preparedParam) { 
     this.param = param; 
    } 
} 

class ChildClass { 

    public ChildClass (Map<String, Object> params) { 
     // need to work with params and prepare param for super constructor 
     super(param); 
    } 
} 

回答

11

您可以創建一個靜態方法,但這改造和調用。

class ChildClass { 

    static String preprocessParams(Map<String, Object> params) { 
     ... 
     return someString; 
    } 

    public BaseClass(Map<String, Object> params) { 
     super(preprocessParams(params)); 
    } 
} 
5

這裏有一個辦法:

class ChildClass { 
    public ChildClass(Map<String, Object> params) { 
     super(process(params)); 
    } 

    private static String process(Map<String, Object> params) { 
     // work with params here to prepare param for super constructor 
    } 
} 
0

我至今率羅馬的回答是最好的。 如果父類提供默認構造函數,則可以實例化super對象,然後使用setter方法。

2

因爲許多參數必須準備/初始化簡單factory method更適合我的解決方案。在我看來,這是一點點清晰的解決方案。無論如何感謝所有的答案。

class BaseClass { 
    protected Object preparedParam; 

    public BaseClass(Object preparedParam) { 
    this.preparedParam = preparedParam; 
    } 
} 

class ChildClass extends BaseClass { 

    private ChildClass(Object preparedParam) { 
    super(preparedParam); 
    } 

    public static ChildClass createChildClass(Map<String, Object> params) { 
    Object param1 = params.get("param1"); 

    // prepare params here 

    ChildClass result = new ChildClass(param1); 

    // do other stuff 

    return result; 
    } 
} 
+0

有時,超級構造函數有一個值,但超類沒有方法找回您在傳遞的對象,如果是這樣的話,你需要在超類對象,以及在你自己的代碼,那麼工廠方法是一個解決方案,而靜態準備方法是沒有解決方案。 – 2011-11-04 17:57:53