我有以下内容:
public class ExampleObject extends GridObject {
private static Context c;
private static final String name = "Example Object";
private static Bitmap skin = BitmapFactory.decodeResource(c.getResources(), R.drawable.defaultObject );
private static float x,y;
public ExampleObject(Context c, float x, float y) {
this.c = c;
this.x = x;
this.y = y;
}
}
该类有 3 个静态类成员,该图像是一个已解码的位图,我希望它被解码一次,并且仅用于该对象的所有实例。
在目前的状态下,这个目标实现了吗?或者每次创建此类的实例时都会对其进行解码?
应该怎样做?
最佳答案
静态字段只会被初始化一次;这是由 JLS 保证的。
但是,在类初始化时会调用 decodeResource
方法,此时您的 Context
为 null,因此会失败。如果您想要一个仅初始化一次的静态字段,您将需要更复杂的东西;有点接近单例的东西。
public class ExampleObject extends GridObject {
private static final String name = "Example Object";
private static Bitmap skin;
// = BitmapFactory.decodeResource(c.getResources(), R.drawable.defaultObject );
private static float x,y;
public ExampleObject(Context c, float x, float y) {
synchronized(ExampleObject.class) {
if(skin == null) {
skin = BitmapFactory.decodeResource(c.getResources(), R.drawable.defaultObject);
}
}
this.x = x;
this.y = y;
}
}
关于Java静态类变量初始化效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28127320/