我有以下内容:
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个静态类成员,图像是一个已解码的位图,我希望它只被解码一次,只能用于此对象的所有实例。
目前它的实现状态是什么?或者每次创建此类的实例时它是否被解码?
应该怎么做?
答案 0 :(得分:2)
静态字段只会被初始化一次;这是由JLS保证的。
但是,在初始化类时将调用decodeResource
方法,此时Context
为空,因此它将失败。如果你想要一个只初始化一次的静态字段,你需要更复杂的东西;更接近单身的东西。
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;
}
}
答案 1 :(得分:1)
您可以通过以下类定义实现预期的行为。
public class ExampleObject extends GridObject {
private static Bitmap skin;
public static Bitmap getSkin(Context c){
if(skin == null){
skin = BitmapFactory.decodeResource( c.getResources(), R.drawable.defaultObject );
}
return skin;
}
}
答案 2 :(得分:1)
静态变量只初始化一次,并且该类的所有实例都要共享它的单个副本。
这个单一的初始化过程仅在首次加载类时自动运行一次。
您可能希望使用“静态块”来初始化类的静态字段。 例如:
// start of static block
static {
//initialize your static fields
System.out.println("static block called ");
}
// end of static block