[英]Java Static Class Variable Initialisation Efficiency
我有以下幾點:
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;
}
}
您可以通過以下類定義來實現預期的行為。
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;
}
}
靜態變量僅初始化一次,並且該類的所有實例都將共享它的單個副本。
第一次加載該類時,此單個初始化過程僅自動運行一次。
您可能要使用“靜態塊”來初始化類的靜態字段。 例如:
// start of static block
static {
//initialize your static fields
System.out.println("static block called ");
}
// end of static block
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.