2015-01-24 2 views
0

나는 다음과 같습니다자바 정적 클래스 변수 초기화 효율성

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 개 정적 클래스 회원이이 이미지는 디코딩 된 비트 맵, 나는 그것이 한 번 디코딩 한 번만 ALL에서 사용하기 위해 싶은 이 객체의 인스턴스

현재 상태가 달성 되었습니까? 또는이 클래스의 인스턴스가 만들어 질 때마다 디코딩됩니까?

어떻게해야합니까?

+0

디코딩 할 때 초기화되지 않으므로 널 포인터 예외가 발생합니다. – SMA

+0

참조 http://www.javaworld.com/article/2073352/core-java/simply-singleton.html – Fizz

답변

2

정적 필드는 한 번만 초기화됩니다. 이것은 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; 
    } 
} 
+0

public 클래스 ExampleObject GridObject를 확장합니다. { private static Context c; private static final String name = "예제 개체"; 비공개 정적 비트 맵 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; } 생성자 –

+0

에 전달되었으므로 생성자 내에서 디코드해야합니다. 객체의 인스턴스를 만들 때마다 호출합니다. –

+0

또는 JLS는 정적이며 이미 정의되어 있으므로 무시됩니다. –

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; 
    } 
} 
+0

완벽한 감사합니다. 그렇게 사소한 나는 때때로 바보 야! 감사합니다 대단히 감사합니다 –

+0

싱글 톤이 더 좋은 해결책입니다. – Simon

1

정적 변수는 한 번만 초기화되며 클래스의 모든 인스턴스에서 단일 복사본을 공유합니다.

이 단일 초기화 절차는 클래스가 처음로드 될 때 한 번만 자동으로 실행됩니다.

"정적 블록"을 사용하여 클래스의 정적 필드를 초기화 할 수 있습니다. 예 :

// start of static block 
    static { 
     //initialize your static fields 
     System.out.println("static block called "); 
    } 
    // end of static block