2010-06-12 61 views
2

我正在驗證構造函數和方法參數,因爲我希望軟件(特別是它的模型部分)快速失敗。使用註解驗證構造函數參數或方法參數,並讓它們自動拋出異常

結果,構造函數的代碼往往看起來像這樣

public MyModelClass(String arg1, String arg2, OtherModelClass otherModelInstance) { 
    if(arg1 == null) { 
     throw new IllegalArgumentsException("arg1 must not be null"); 
    } 
    // further validation of constraints... 
    // actual constructor code... 
} 

有沒有辦法做到這一點與註釋驅動的方法?例如:

public MyModelClass(@NotNull(raise=IllegalArgumentException.class, message="arg1 must not be null") String arg1, @NotNull(raise=IllegalArgumentException.class) String arg2, OtherModelClass otherModelInstance) { 

    // actual constructor code... 
} 

在我眼中,這會使實際代碼更具可讀性。

在理解中有支持IDE驗證的註釋(如現有的@NotNull註釋)。

非常感謝您的幫助。

回答

6

在public方法中使用assert來檢查參數不是一個好主意。在編譯過程中,可以從代碼中刪除所有的斷言,因此不會在運行時執行檢查。這裏的更好的解決方案是使用驗證框架,如Apache Commons。在這種情況下,您的代碼可能是:

public MyModelClass(String arg1, String arg2, OtherModelClass otherModelInstance) { 
    org.apache.commons.lang3.Validate.notNull(arg1, "arg1 must not be null"); 
    // further validation of constraints... 
    // actual constructor code... 
} 
+0

它已經兩年充滿軟件開發。想讓你知道我認爲這是實現它的最好方法,如果你在服務器Java環境中(即不是Android或類似的),所以你可以輕鬆地添加第三方庫 – 2013-04-30 07:31:30

1

這樣的框架確實存在(JSR-330),但首先,我會辯論註釋方法更具可讀性。像這樣的東西似乎更對我說:

public MyModelClass(String arg1, String arg2, OtherModelClass otherModelInstance) { 
    Assert.notNull(arg1, "arg1 must not be null"); 
    // further validation of constraints... 
    // actual constructor code... 
} 

其中Assert.notNull是一個靜態方法某處(和在春季或共享郎等提供)。

但假設您確信使用了註釋,請參閱Hibernate Validator,它是JSR-330 API的參考實現。這有類似你所描述的註釋。

這裏的問題是您需要框架來解釋這些註釋。只要打電話new MyModelClass()不會在沒有一些類加載魔法的情況下做到這一點。

喜歡Spring可以使用JSR-330註釋驗證模型中的數據,所以你可以have a look at that,但這可能不適合你的情況。然而,類似的東西將是必要的,否則註釋不過是裝飾。

+0

事實上,我使用的彈簧很多。感謝您的幫助。 也許你是對的,靜態的「Assert.notNull」方法是更可讀的方法。 – 2010-06-13 15:01:05

相關問題