靜態常量是編譯期常量,如果其值被改變,那么使用方需要重新編譯。項目初始化的時候會被全部加載到內存中,消耗內存。
枚舉的創建可以把一類具有相同意義的常量放在一個相同的枚舉類里,獲取里面的常量值是在類加載使用的時候使用反射機制獲取的值。
枚舉類的創建:
public enum BooleanType {
NULL(""),
TRUE("1"),
FALSE("0");
BooleanType(String value) {
EnumUtil.changeNameTo(this,value);
}
}
獲取枚舉值的數值的幫助類:
public class EnumUtil {
/**
* 獲取枚舉值
*
* @param enumInstance 枚舉常量
* @param value 枚舉常量的value
* @param <T> 枚舉的類型參數
*/
public static <T extends Enum<T>> void changeNameTo(T enumInstance, String value) {
try {
Field fieldName = enumInstance.getClass().getSuperclass().getDeclaredField("name");
fieldName.setAccessible(true);
fieldName.set(enumInstance, value);
fieldName.setAccessible(false);
} catch (Exception e) {
e.printStackTrace();
}
}
}
幫助類這里使用了反射機制。
/**
* 枚舉類型的比較,包括null
*
* @param enum1 枚舉常量1
* @param enum2 枚舉常量2
* @return 如果相等返回true, 否則返回false
*/
public static boolean enumEquals(Enum enum1, Enum enum2) {
if (enum1 == null && enum2 == null) {
return true;
} else if (enum1 != null) {
return enum1.equals(enum2);
} else {
return enum2.equals(enum1);
}
以上是枚舉值的比較邏輯。
枚舉的使用:
System.out.println(BooleanType.FALSE);
