java – 实现在应用程序启动时初始化的“常量”类,而不是在编译时

我正在研究一个使用大类常量的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注释从属性文件中注入属性.

上一篇:php – static关键字对常量有影响吗?


下一篇:《SQL必知必会》读书笔记