Java静态类变量初始化效率

时间:2015-01-24 16:01:55

标签: java android performance

我有以下内容:

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个静态类成员,图像是一个已解码的位图,我希望它只被解码一次,只能用于此对象的所有实例。

目前它的实现状态是什么?或者每次创建此类的实例时它是否被解码?

应该怎么做?

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