在開發java代碼的時候往往會遇到很多常量,可能會出現以下內容的代碼
switch (userType){
case 1:
//1是管理員
//to do something
break;
case 2:
//2是普通會員
//to do something
break;
case 3:
//3是遊客
//to do something
break;
}
判斷用戶的類型,不同的用戶類型做不同的處理,這裏面有註釋,所以能看懂寫的是什麼,如果沒有註釋,你需要去看其他代碼或者資料分清楚這個userType有幾種類型,分表代表什麼含義,嚴重降低開發效率,但這又是平時開發中是經常看到的。
下面跟着我一步一步提升代碼質量
上面的示例代碼中,在CheckStyle(這個東西寫java的都應該要了解)規範中,這種寫法也是會報Magic Number警告的,在此規範中,只有0和1等可以直接寫數值,其他數值的定義都要提到類裏面作爲靜態成員變量。類似於下面這樣的代碼
public class Codetest {
private static final int ADMIN = 1;
private static final int USER = 2;
private static final int VISITOR = 3;
public static void main(String[] args) {
int userType = ADMIN;
switch (userType) {
case ADMIN:
//to do something
break;
case USER:
//to do something
break;
case VISITOR:
//to do something
break;
}
}
}
怎麼樣,這樣即使沒有註釋,你是不是也能看懂一些了,對應英文翻譯一下就知道常量代表的含義了,這樣checkstyle也不會報MagicNumber 的警告了。
但是,要是不同的類都需要使用相同的變量的怎麼辦,相同的常量定義不可能每個類裏面都定義一遍,那樣重複代碼太多,於是就把所有的常量集中在一起,單獨定義一個常量類,於是便有了以下的代碼
public class Constant {
public static final int ADMIN = 1;
public static final int USER = 2;
public static final int VISITOR = 3;
}
這樣,需要用常量的話使用這個類就好了
但是,代碼依然可以進行優化,因爲在這和類裏面出現了大量的public static final的代碼,我們可以通過其他方式,來避免大量這樣的定義,這種方式,就是使用接口的方式。
public interface CodeConstant {
/**
* 用戶類型
*/
interface USER_TYPE{
int ADMIN = 1;
int USER = 2;
int VISITOR = 3;
}
/**
* 用戶登錄狀態
*/
interface USER_STATUS{
int LOGIN = 1;
int LOGOUT = 2;
}
}
可以注意到,大量的public static final不見了
原理:在接口裏面定義屬性,會自動加上public static final
在我們用的時候,就可以這麼調用了~~
import cn.infol.service.webclient.rest.CodeConstant.USER_TYPE;
public class Codetest {
public static void main(String[] args) {
int userType = USER_TYPE.USER;
switch (userType) {
case USER_TYPE.ADMIN:
//to do something
break;
case USER_TYPE.USER:
//to do something
break;
case USER_TYPE.VISITOR:
//to do something
break;
}
}
}
這種優點顯而易見,可以很方便的定義常量,並且常量是可以分層次結構的
在應對一般的系統開發,這種常量的定義方法已經能夠滿足我們的需求了。
如果你的項目比較大,業務邏輯比較複雜,會對常量有些特殊操作,比如說:你需要找到這個USER_TYPE常量類別下有幾種類型的常量,這時候,接口定義法不太適用了,可以參照我的下一篇 “java架構篇之常量管理(枚舉定義法)”
架構觀點:不一定越高級的方法越好,高級的方法在提高自己擴展性的同時,也會帶來一定工作量,適用自己項目的方法纔是最好的方法