Java:是否可以使用final设置未初始化的类的值?

时间:2013-02-05 19:49:39

标签: java optimization

采用以下示例类:

public class GlobalExample{
    static int width;
    static int height;
    static int size;
}

可以使用以下命令从单独的类访问/初始化类成员:

GlobalExample.width = 1

但是,如果我想让变量最终(正如我所理解的那样,当程序大量访问变量时它会使事情变得更有效)它们不能再在外部初始化,但它们似乎也无法初始化在构造函数之外的类中。但是,由于GlobalExample本身从未初始化,因此构造函数不会运行。

我的问题是,是否有办法在类中初始化最终变量。

或者,我只是在效率方面咆哮错误的树吗?创建一个VariablePackage类的实例并将其传递给百万个函数调用会更有效吗?

由于

4 个答案:

答案 0 :(得分:3)

声明它们时是否无法初始化它们?

public class GlobalExample{
    final static int width = 1;
    final static int height = 5;
    final static int size = 100;
}

如果您必须动态修改它们,可能final不适合此处。

答案 1 :(得分:0)

为每个变量添加boolean,告诉您是否已设置变量,将变量设为私有,然后检查公共设置器中的boolean

public class GlobalExample{
    private static int width;
    private static int height;
    private static int size;
    private static boolean widthSet;
    private static boolean heightSet;
    private static boolean sizeSet;

    public static void setWidth(int width) {
        if (widthSet) {
            widthSet = true;
            GlobalExample.width = width;
        } else {
            // Throw exception maybe?
        }
    }

    public static int getWidth() {
        if (widthSet) {
            return width;
        } else {
            // Throw an exception
        }
    }

    // Etc.
}

或者,您可以使用包装类(IntegerCharacter等)并仅在值为null时设置它们。这与boolean方法类似,只是boolean被整合到变量本身的值中(即如果它是null则不设置。)

答案 2 :(得分:0)

除了内联初始化static final变量外,您还可以使用静态初始化块:

public class MyClass {
    public static final String myFinal;
    static {
        myFinal = "Hello world";
    }
}

static块中,您可以编写获取所需值所需的代码。

你是否明智地咆哮错误的树?大概。首先写下它。然后,一旦您确认这实际上是应用程序中的性能瓶颈,请尝试使用几种不同的方式对其进行编码并测量其影响。

此外,从设计的角度来看,静态的东西往往很难处理,所以问问自己,你的系统是否真的需要这些字段是静态的。

答案 3 :(得分:0)

运行更复杂的初始化逻辑:

public class GlobalExample {
    private static final int height;
    private static final int width;

    static {
        switch(getBrowserType()) {
            case 0: height = 100; width = 50; break;
            case 1: height = 400; width = 600; break;
            default: height = 798; width = 1024; break;
        }
    }
}
相关问题