常量應該封裝到常量類,常量接口,還是枚舉類中?

前言
之前項目中響應前臺的接口中會用到一些公共常量。這個時候就比較糾結,常量到底是封裝到哪裏比較好呢,因爲以前寫的很多代碼不怎麼規範,而且有時候常量用到的不算太多太集中,所以就哪裏用到哪個類上去聲明一個出來,這樣雖然很方便,但是統一維護起來,項目做大了,有些時候你要引用一個你記得你明明聲明過的常量,卻找半天都找不到,而且後期需要對常量中的內容進行一些修改的時候,維護起來也十分不方便,代碼整體結構也不優雅。所以自己決定研究一下到底常量應該封裝到哪裏比較好呢。因爲題目所說的三種自己也都見過,但是具體的區別以及優劣卻沒有細細鑽研。今天這裏簡單的記錄整理一下,以防自己以後忘記。

示例代碼
第一種使用接口:

public interface Constants{
  
    int AUDIT_STATUS_PASS = 1;
    int AUDIT_STATUS_NOT_PASS = 2;
}
第二種使用類:

public final class Constans{
  
    private Constans() {
    }
  
    public static final int AUDIT_STATUS_PASS = 1;
    public static final int AUDIT_STATUS_NOT_PASS = 2;
}
第三種使用枚舉:

public enum Constants {
 
    AUDIT_STATUS_PASS(1),
    AUDIT_STATUS_NOT_PASS(2);
    
    private int status;
    
    private Constants(int status){
        this.setStatus(status);
    }
 
    public int getStatus() {
        return status;
    }
}
首先,前兩種可以看成是一樣的。第一種寫起來更方便一些吧,省去了public static final字段。但是如果從細想,接口可以被繼承,可以將內容深入到其實現類代碼中。這樣對於一個常量類接口來說顯然是不合理,但是你確實無法規避這個問題。唯一可以解決的辦法就是棄用常量接口,選用常量類的方式。以final字段修飾,防止其被繼承。並將其構造函數private化,防止被實例化。這顯然在硬性上可以很好地解決這個問題。

但即便如此枚舉任然是首選,但是如果不使用枚舉的話,在《Effective Java》一書中,作者建議使用一般類加私有構造函數的方式。但是參考了 StackOverFlow 上大牛的講解,我認爲一般類上也應該再加上final字段。這樣可以更好的避免一些不必要的麻煩。

參考:Interfaces with static fields in java for sharing 'constants'

常量接口
你可能會問常量接口就真的一無是處嗎?

也不是,但是和是也差不多。但是我還是會用,貼一段自己的代碼

public final class Const {
 
    private Const() {
    }
 
    public static final String CURRENT_USER = "currentUser";
 
    // 這裏沒有使用interface進行分組是因爲 這兩個對象不好分組。
    public static final String EMAIL = "email";
    public static final String USERNAME = "username";
 
    // 普通用戶和管理員是一個組,枚舉過於繁重
    // 內部接口類 把常量進行分組。沒有枚舉重,但還可以分組,而且裏面還是常量
    public interface Role {
        int ROLE_CUSTOMER = 0; // 普通用戶
        int ROLE_ADMIN = 1; // 管理員
    }
}
具體常量接口的作用註釋中已經寫得很清楚了。總結下來就是前提你是內部接口,那麼你可以直觀分組,還簡潔。

總結
綜上:優先枚舉,常量類,接口(不建議)。

————————————————

轉自:https://blog.csdn.net/qq_28867949/article/details/79783808

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