數據的合法性檢測(轉)
一般的數據類都應該有自己的數據合法性檢查,如一個Person類,它的年齡屬性是int型的,但是如果給它賦值10000則為不合法,一個人不可能活那么長時間。因此需要在創建該類的對象時必需對其進行合法性檢查,若構造方法傳入的是非法數據,則不讓其創建該對象,并拋出異常。也許大多數人認為只需要對構造方法傳入的參數進行合法性檢查即可。如下所示:
class ValidClass
{
????????int ?dataValid1;
????????String dataValid2;
?????????public ValidClass(int i, String str)
?????????{
???????????????check(int i, String str);
???????????????dataValid1 = i;
???????????????dataValid2 = str;
?????????}
?????????void?check(int i, String str)
?????????{
????????????if(i >100 && i <= 0) throws new RuntimeException("message");
????????????if(str == "str") throws new RuntimeException("message");
?????????}
?????????void setDataValid1(int dataValid1)
?????????{
???????????????this.dataValid1 = dataValid1;
?????????}
}
實際上這種合法性并不可靠,這樣只是保證了在構造方法中傳入的數據是合法的,但是不能保證程序員在使用該對象時能傳入合法的數據。如下程序代碼:
ValidClass validClass = new ValidClass(2, "123");
validClass.set(200);
這樣使用的話,程序運行并不會報錯,但是實際上我們已經傳入了非法數據到該對象中去了,因此為了避免出現程序員在使用的時候也犯這種錯誤,對數據的合法性檢查的正確方式應如下所示:
class ValidClass
?????? {
????????????? int ?dataValid;
?????????????
????????????? protected checkDataValid()
????????????? {
???????????????????? check if dataValid valid
???????????????????? if (fail)
???????????????????? {???? throws new RZXDataException(this, “.needValidate=”
+needValidate); }
????????????? }
public ValidClass(int in)
????????????? {????
setDataValid(in);????
}
????????????? public setDataValid(int in)
????????????? {?????????????????????
?????????????????????checkNeedValidate();
???????????????????? dataValid = in;
????????????? }
?????? }
在set方法中進行合法性檢查,然后在構造方法中也調用set方法設置字段值,而不直接使用類中的字段。這樣做的好處很明顯:不僅保證了構造方法中傳入的數據必須合法,而且可以保證程序在使用的過程中不能使用非法數據,如果程序員使用了非法數據,程序運行必然出錯,并且能夠很快的找到錯誤的根源所在。
?????????另外,有些程序員認為,有些數據類的對象全部來自于另一個數據對象,也就是說該類的構造方法中的參數即另一個數據類對象,因此在該類中所有與被傳入對象類中有相同的合法性檢查的數據字段不需要再進行合法性檢查了。其實這種想法是錯誤的,問題與上面所說的一樣,你能保證傳入的數據是合法的,但不能保證使用者在調用你的set方法時能100%傳入合法數據。因此,程序員是不應該偷這個懶的。也許有人會說,他們的合法性檢查完全一樣,如果在該類中再寫的話就會出現大量的重復代碼了。能想到這里是對的,但是如果你有一定的經驗,你就知道去建立一個專門保存合法性檢查方法的類,這樣你就可以在需要進行合法性檢查的時候就使用該類里面的方法,如果該類中沒有你所需要的方法,你就可以在里面加入你所需要的合法性檢查方法,再去使用它。這樣做會使得代碼非常的清晰。
posted on 2006-12-19 13:06 liaojiyong 閱讀(272) 評論(0) 編輯 收藏 所屬分類: Java