Java中的Constants類

Constants類即常量類是將一些常用的變量集合到一個地方的類,常量應該定義在類中,而不是接口中(見Effective Java 2nd Edition, Item19),如果定義的常量是int類型的,可使用Enum類來代替(見Effective Java 2nd Edition, Item30),然而,有些常量類,比如String類型的常量類,可能不太適合使用Enum類來代替。

不像Enum類,系統在編譯後自動生成了values方法,返回所有Enum類中常量的數組,自行定義的常量類沒有這樣的方法,如果定義的常量過多,可能得到所有常量的數組比較麻煩,可通過Java的反射機制得到這個類的所有常量數組:

    public static String[] values() {
        Field[] fields = Constants.class.getFields();
        String[] s = new String[fields.length];
        for(int i=0,n=fields.length; i<n; i++) {
            try {
                Field f = fields[i];
                s[i] = (String) f.get(null);
            } catch (Exception ex) {
                Logger.getLogger(Constants.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return s;
    }

也可定義一個方便的返回Set的方法:

    public static Set<String> asSet() {
        return new HashSet<String>(Arrays.asList(values()));
    }

完整的代碼,一個完整的Constants類的模板:

public class Constants {
    
    public static final String USER_HOME = "user.home";
    public static final String USER_DIR = "user.dir";
    public static final String OS_NAME = "os.name";
    
    private Constants(){}
    
    public static String[] values() {
        Field[] fields = Constants.class.getFields();
        String[] s = new String[fields.length];
        for(int i=0,n=fields.length; i<n; i++) {
            try {
                Field f = fields[i];
                s[i] = (String) f.get(null);
            } catch (Exception ex) {
                Logger.getLogger(Constants.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return s;
    }
    
    public static Set<String> asSet() {
        return new HashSet<String>(Arrays.asList(values()));
    }
    
    public static void main(String[] args) {
        System.out.println("values="+Arrays.asList(values()));
        System.out.println("set="+asSet());
    }
}

常量類可通過import static導入,個人更喜歡把常量類和Utils工具類放在一塊,都可以通過import static導入,然而,常量類也有一些缺陷,在編譯時如果修改了常量類,編譯時依賴常量類的其他類文件並不重新編譯,所以在開發過程中,修改常量類後儘量先對項目進行clean,然後build,這也是不建議使用接口定義常量類的主要原因,調用接口的客戶API不可能在接口重新發布時都進行編譯。



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