2013-02-19 1 views
0

그래서 모든 파일에서 액세스 할 수있는 모든 종류의 데이터를 보유하기로되어있는 Global 클래스가있다. Global은 다음과 같습니다Java - 내 글로벌 클래스에 대한 참조를 잃어 버린다.

public class Global{ 
public static int rules = 0; 
public static String data; 
public static int score; 
public static int speed = 0; 
//etc... 
} 

내가 설정하고 Global.x = ___ 등을 수행하여 물건을 얻을.

그러나 최근에 만든 프로젝트 (예 : View A)의 메모리 누수가 정리 된 시간보다 오래 유지되었습니다.

View AGlobal.x으로 지정됩니다.

이제 View B으로 이동하면 View A이 GC됩니다.

그러나 Global.x에는 더 이상 값이 없습니다.

Java에서 예상되는 동작입니까? 그렇다면 View A에서 전역 클래스에 변수를 할당하고 View A이 죽은 후에도 변수가 유지되도록하려면 어떻게해야합니까?

아니면 다른 곳에서 뭔가 잘못하고있는 것입니까?

나는 뭔가를 간과 할 경우에 대비해 궁금해했다.하지만 아마 후자 일 것이다.

+1

보기에서 무엇을 의미합니까? –

+0

안드로이드'SurfaceView'.내 질문은 일반적인 Java 질문 일 것이라고 생각했기 때문에 세부 사항에 너무 많이 들어가기를 원하지 않았다. – Houseman

+0

'A'보기에'Global' 인스턴스를 만들고 거기에 데이터를 설정하거나'Global'이 속성은'public static'으로 (그런데이 마지막 것은 매우 나쁜 디자인입니다)? –

답변

2

디자인 문제;

실제로 가베지 컬렉션을 View A이라고 생각할 수있는 두 가지 방법이 있습니다. Global.x 값에 영향을 미칩니다.

  • Global.x는 (또는 사용) View AWeakReference를하거나 함께 쓰레기 수집 뭔가.
  • View A에는 Global.x의 값을 변경하는 종료 기가 있습니다.

    내 가장 좋은 방법은 오류 다른 곳에서 볼해야한다는 것입니다 (물론 내가 당신의 코드를 볼 수 있지만) 다음의

어느 가능성이 소리. 전역 상태 변수는 본질적으로 어떤 방식 으로든 스레드로부터 안전하지 않으므로 문제는 스레딩 관련 문제 일 수 있습니다.

+0

좋습니다. 나는 그것이 다른 곳에있는 것을 살 것이다. – Houseman

3

문제는 명시된 바와 같이 특정 문제를 해결하는 데 도움이되는 사실이 누락되었습니다. 문제를 재현 할 수있는 가장 작은 Java 코드를 붙여 넣는 것을 고려하십시오. 그 말은, 디자인이 나쁘다는 것과 싱글 톤 사용을 고려해야한다는 것입니다.

public class Global { 

    private Global INSTANCE = new Global(); 
    private int speed; 

    private Global() { 
     // whatever you do to initialize... 
     speed = 65; 
    } 

    public Global getInstance() { 
    } 

    public int getSpeed() { 
     return speed; 
    } 

    public void setSpeed(int speed) { 
     this.speed = speed; 
    } 
} 

당신은에있는 어떤 범위에서

, 당신은 말할 수 :

Global.getInstance().getSpeed(); 

또는

Global.getInstance().setSpeed(25); 

등 ... 옆

+0

원래 문제의 해결책은 아니지만 OP 디자인의 문제를 해결할 수 있습니다. –

+0

싱글 톤을 사용하는 것은 '정적'값을 가진 그의 클래스에서 현재하고있는 것보다 더 나은 관행이 아닙니다. –

+0

스레드를 안전하게 만드는 것이 더 나은 방법이 아닙니까? 그의 명시된 문제는 가짜로 보인다. –

관련 문제