采用以下示例类:
public class GlobalExample{
static int width;
static int height;
static int size;
}
可以使用以下命令从单独的类访问/初始化类成员:
GlobalExample.width = 1
但是,如果我想让变量最终(正如我所理解的那样,当程序大量访问变量时它会使事情变得更有效)它们不能再在外部初始化,但它们似乎也无法初始化在构造函数之外的类中。但是,由于GlobalExample本身从未初始化,因此构造函数不会运行。
我的问题是,是否有办法在类中初始化最终变量。
或者,我只是在效率方面咆哮错误的树吗?创建一个VariablePackage类的实例并将其传递给百万个函数调用会更有效吗?
由于
答案 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.
}
或者,您可以使用包装类(Integer
,Character
等)并仅在值为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;
}
}
}