java架構篇之常量管理(接口定義法) 利用接口定義常量(架構師入門 初學)

在開發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架構篇之常量管理(枚舉定義法)”

架構觀點:不一定越高級的方法越好,高級的方法在提高自己擴展性的同時,也會帶來一定工作量,適用自己項目的方法纔是最好的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章