JavaのConstantsクラス


Constantsクラス、すなわち定数クラスは、インタフェースではなく、いくつかの一般的な変数を1つの場所に集約するクラスであり、定数はクラスに定義されるべきである(Effective Java 2 nd Edition,Item 19参照)、定義された定数がintタイプである場合、Enumクラスを使用して代替することができる(Effective Java 2 nd Edition,Item 30参照)が、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がインタフェースの再パブリッシュ時にコンパイルされることはありません.