我正在研究一个使用大类常量的Java项目,例如:
public final class Settings {
public static final int PORT_1 = 8888;
public static final int PORT_2 = 8889;
...
}
现在,这些常量的一些值在编译时不再可用,所以我需要一种方法在应用程序启动时“初始化”它们(例如从args []).一旦初始化,就没有办法改变它们.我对java不是很熟练,我该如何以可接受的方式做到这一点?
我想过使用一个类似于“一次性”设置方法的单例,如果多次调用会抛出一个异常,但它接缝太乱了…
解决方法:
好吧,使用系统属性是一种方法,除非有大量的常量.
private static final String CONSTANT1 = System.getProperty("my.system.property");
private static final int CONSTANT2 = Integer.valueOf(System.getProperty("my.system.property"));
使用-D标志启动应用程序时,将在命令行上传递系统属性.
如果变量太多,可以使用静态初始化程序,其中可以读取包含属性的属性文件或类似文件:
public class Constants {
private static final String CONSTANT1 = System.getProperty("my.system.property");
private static final int CONSTANT2 = Integer.valueOf(System.getProperty("my.system.property"));
private static final String CONSTANT3;
private static final String CONSTANT4;
static {
try {
final Properties props = new Properties();
props.load(
new FileInputStream(
System.getProperty("app.properties.url", "app.properties")));
CONSTANT3 = props.getProperty("my.constant.3");
CONSTANT4 = props.getProperty("my.constant.3");
} catch (IOException e) {
throw new IllegalStateException("Unable to initialize constants", e);
}
}
}
请注意,如果您使用的是一些外部框架(如Spring Framework或类似框架),通常会有一个内置机制.例如. – Spring Framework可以通过@Value注释从属性文件中注入属性.