Constants類即常量類是將一些常用的變量集合到一個地方的類常量應該定義在類中而不是接口中(見Effective Java nd Edition Item)如果定義的常量是int類型的可使用Enum類來代替(見Effective Java nd Edition Item)然而有些常量類比如String類型的常量類可能不太適合使用Enum類來代替
不像Enum類系統在編譯後自動生成了values方法返回所有Enum類中常量的數組自行定義的常量類沒有這樣的方法如果定義的常量過多可能得到所有常量的數組比較麻煩可通過Java的反射機制得到這個類的所有常量數組
view plain public static String[] values() { Field[] fields = ConstantsclassgetFields()String[] s = new String[fieldslength]for(int i=n=fieldslength i<n i++) { try { Field f = fields[i]s[i] = (String) fget(null)} catch (Exception ex) { LoggergetLogger(ConstantsclassgetName())log(LevelSEVERE null ex)} return s}
也可定義一個方便的返回Set的方法view plain public static Set<String> asSet() { return new HashSet<String>(ArraysasList(values()))}完整的代碼一個完整的Constants類的模板
view plain public class Constants {
public static final String USER_HOME = userhomepublic static final String USER_DIR = userdirpublic static final String OS_NAME = osname
private Constants(){}
public static String[] values() { Field[] fields = ConstantsclassgetFields()String[] s = new String[fieldslength]for(int i=n=fieldslength i<n i++) { try { Field f = fields[i]s[i] = (String) fget(null)} catch (Exception ex) { LoggergetLogger(ConstantsclassgetName())log(LevelSEVERE null ex)} return s}
public static Set<String> asSet() { return new HashSet<String>(ArraysasList(values()))}
public static void main(String[] args) { Systemoutprintln(values=+ArraysasList(values()))Systemoutprintln(set=+asSet())}
常量類可通過import static導入個人更喜歡把常量類和Utils工具類放在一塊都可以通過import static導入然而常量類也有一些缺陷在編譯時如果修改了常量類編譯時依賴常量類的其他類文件並不重新編譯所以在開發過程中修改常量類後盡量先對項目進行clean然後build這也是不建議使用接口定義常量類的主要原因調用接口的客戶API不可能在接口重新發布時都進行編譯
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26527.html