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; }
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()); } }