Java静态类变量初始化效率

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

在目前的状态下,这个目标实现了吗?或者每次创建此类的实例时都会对其进行解码?

应该怎样做?

最佳答案

静态字段只会被初始化一次;这是由 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/

相关文章:

java - 基于参数属性的 Mockito 返回值

java - 从 Android 应用分享图像

java - -J-XX 是什么意思?出现在java命令行

performance - DDD 和 Entity Framework 、过滤器

java - 对循环中动态创建的每个按钮都有不同的操作

java - 如何在 Jenkins 中为每项工作全局设置 JVM 选项?

java - LocalDateTime 和数据库中的日期未舍入相同

android - 如何在Android中定义 "inflation"

android - 在警告对话框中显示 TextView

java - 特定文件处理需求的数据结构选择 - java