0

采取以下示例类:

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

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

GlobalExample.width = 1

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

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

或者,我只是在树效率方面发出错误的声音吗?制作一个 VariablePackage 类的实例并将其传递给一百万个函数调用会更有效吗?

谢谢

4

4 回答 4

3

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

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

如果你必须动态修改它们,final这里可能不适合。

于 2013-02-05T19:51:49.517 回答
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)。

于 2013-02-05T20:02:17.210 回答
0

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

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

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

您是否明智地指出了错误的树效率?大概。先简单写一下。然后,一旦您确认这实际上是应用程序中的性能瓶颈,请尝试用几种不同的方式对其进行编码并衡量其影响。

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

于 2013-02-05T20:23:51.070 回答
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;
        }
    }
}
于 2013-02-05T20:26:02.057 回答