java – 在构造函数中初始化public static final变量

我正在尝试为我的应用程序创建一个Version类,它将在加载时从清单中读取版本号,然后仅引用Version.MAJOR等我在其他地方需要的地方.但是,我遇到了这样的问题.这是我目前的代码:

 public class Version {

    public static final int APPCODE;
    public static final int MAJOR;
    public static final int MINOR;
    public static final char RELEASE;
    public static final int BUILD;

    static {

        try {
            Class clazz = Version.class;
            String className = clazz.getSimpleName() + ".class";
            String classPath = clazz.getResource(className).toString();
            if (classPath.startsWith("jar")) {
                String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + "/META-INF/MANIFEST.MF";
                Manifest manifest = new Manifest(new URL(manifestPath).openStream());
                Attributes attr = manifest.getMainAttributes();
                APPCODE = Integer.parseInt(attr.getValue("APPCODE"));
                MAJOR = Integer.parseInt(attr.getValue("MAJOR"));
                MINOR = Integer.parseInt(attr.getValue("MINOR"));
                RELEASE = attr.getValue("RELEASE").charAt(0);
                BUILD = Integer.parseInt(attr.getValue("BUILD"));
            }
        } catch (IOException e) {
            System.exit(9001);
        }
    }
}

它不会编译,因为静态的最终变量可能没有被初始化(例如,如果加载了错误的清单或加载它的异常),我无法弄清楚正确的程序是做什么的.

阅读this问题给了我一些不使用公共静态最终的见解.我应该使用getter方法使用public static吗?

解决方法:

我会:

>删除最终修饰符
>降低公众对私人的可见度.
>为所需字段提供(静态)getter

上一篇:防止应用程序在Android平板电脑上运行


下一篇:如何使用EclipseLink使PostgreSQL与OSGi一起工作