簡體   English   中英

Java靜態類變量初始化效率

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM