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