2010-08-13 111 views
2
public Subclass(String[] parameters) throws IllegalArgumentException { 
    super("Rectangle", 
     Double.parseDouble(parameters[0]), 
    Double.parseDouble(parameters[1]), 
    90, 
    Double.parseDouble(parameters[2]), 
    Double.parseDouble(parameters[3])); 
      if(parameters.length != 4) throw new IllegalArgumentException("bla, bla"); 
    if(parameters == null) throw new IllegalArgumentException("bla, bla"); 
} 

我想在調用超級構造函數之前放入這2個if語句。我知道我不能這麼做,那麼在調用super()之前做這種類型的參數解析(投擲Exception)有什麼無痛的方式?在調用超類的構造函數之前解析子類中的參數

+0

哇!多快啊,謝謝你們!我還不熟悉工廠,但... – plesiv 2010-08-13 23:20:55

+0

這些鏈接將有所幫助 - Builder鏈接非常易於遵循。在這兩種情況下,您都有效地賦予另一個類負責創建所需對象的新實例,而不是直接使用「新」關鍵字調用構造函數。在另一個類中,你可以做任何你想要的參數和狀態驗證。 – Brabster 2010-08-13 23:30:11

+0

如果參數爲null或長度小於4,那麼您的代碼已經拋出了ArrayIndexOutofBoundsException的NullPointerException異常。這些異常不是比IllegalArgumentException更具體/詳細嗎? – 2010-08-14 10:45:16

回答

8

聲明驗證方法服用String[]並將其返回重構你的API更好(比如創建工廠方法)。

+0

驗證應該用「throws」聲明嗎? Nvm,我會編譯並查看:)。謝謝! – plesiv 2010-08-13 23:25:53

+0

@make - 'IllegalArgumentException'未被選中,所以'validate'不需要'throws'列表。 – 2010-08-13 23:46:30

+0

@Stephen C - 非常感謝!忘了那個! – plesiv 2010-08-14 00:56:02

5

您可以創建一個工廠模式(例如abstract factory)來創建從中獲取新實例的工廠對象。然後,在調用真實子類的(私有)構造函數之前,獲取新實例的工廠類方法可能會引發錯誤的參數異常。

在創建和返回新實例之前,您還可以使用Builder pattern來驗證參數。你創建一個構建器對象(通常是一個內部類,以便它可以訪問外部類的私有構造器等),設置它的屬性並調用一個build()方法 - 然後該方法可以在返回新實例之前進行任何驗證。使用param首次

super("Rectangle", Double.parseDouble(validate(param).parameters[0]), 

這一招很快解決了問題,當

private static String[] validate(String[] param) { 
    // do validation here 
    return param; 
} 

,並調用它,但是,作爲另一個海報指出,有時:

+0

非常感謝! – plesiv 2010-08-14 00:55:21

+0

靜態方法相對於構建器的另一個好處 – DPM 2012-02-05 20:27:43

相關問題