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不可能在接口重新发布时都进行编译