2012-05-16 5 views
2

예를 들어이 코드가 유효합니까?클래스 자체에서 클래스를 무효화 할 수 있습니까?

class abc{ 
    int x,y; 
    abc(int x,int y){ 
     this.x=x; 
     this.y=y; 
     while(true) 
      update(); 
    } 

    public void update(){ 
     x--; 
     y--; 
     if(y==0) 
      this=null; 
    } 
} 

위의 내용이 유효하지 않은 경우 그 이유를 설명하십시오. 나는 특정한 반복이 끝난 후 사라지는 수업을 필요로하고있다. 위의 방법에 대한 대안을 제안하십시오.

+0

런타임시 클래스의 존재는 오브젝트 때문입니다. 존재하지 않는 것은 무엇을 의미합니까? 객체가 존재하지 않는다면 바로 그 것입니다. 그리고 그것은 gc가하는 일입니다. 그렇죠? 무료 참조? –

+5

'this = null'은 무엇을 기대하고 있습니까? – NPE

+0

가능한 복제본 [Java에서 null이 될 수 있습니까?] (http://stackoverflow.com/questions/3789528/can-this-ever-be-null-in-java) – skaffman

답변

4

아니요. 이유는 개체를 null로 설정하지 않기 때문입니다. 당신이 말할 때 obj = null;null을 객체에 대한 참조를 보유하고있는 변수에 넣는다. 아마도 같은 객체에 대한 다른 많은 참조가있을 것입니다.

나는 싶은 것은 종류의 객체를 무효화 수집이 쓰레기를 만들하지만 클래스 내부의이 결정을하는 것이라고 생각합니다. 이것이 문제라면 약한 참고 문헌을 살펴보기를 권합니다.

다른 가능한 해결책은 java에서 "스마트 참조"를 구현하는 것입니다. 객체에 대한 실제 참조를 보유 할 클래스 SmartReference을 만들 수 있습니다. 객체는이 스마트 참조에 대한 콜백을 보유하고 구문 적으로 잘못된 표현 인 this = null과 같은 어떤 메소드 invalidate()을 호출해야합니다. 그러한 객체를 직접 참조하지 말고 스마트 참조 만 사용해야합니다.

유일한 질문은 "왜 이것을하고 싶니?"입니다. 실제로 이것은 코드가 더 복잡하고 불안정해질 수 있습니다. 상상해보십시오 : 객체가 무효화하기로 결정 했으므로 "스마트 참조"가 보유하고있는 참조가 null이됩니다. 이제 개체를 사용하려고 할 때이 스마트 참조의 모든 소유자가 NPE를 얻습니다! 이러한 메커니즘이 java에 존재하지 않으며 응용 프로그램 프로그래머가 직접 메모리를 관리 할 수없는 이유입니다.

결론 : 모든 개체 참조를 제거하고 GC로 하여금 열심히하도록하십시오. 그것을 믿어 라. 그것은 쓰레기를 청소하는 것을 알고 있습니다.

7

아니요,이 코드는 유효하지 않습니다.

또한 유효한 경우 의미가있는 의미를 알 수 없습니다.

위 방법에 대한 대안을 제안하십시오.

개체는 참조가있는 한 존재합니다. 개체가 가비지 수집 대상이되도록하려면 참조 할 수있는 참조가 없는지 확인해야합니다 (이 경우 y이 0이되는 즉시 발생합니다).

+0

루프가 영원히 계속 실행됩니다. update는 생성자의 while 루프가 부울 값을 리턴함으로써 종료 될 것이라고 알려줄 필요가있다 :'return y! = 0;' –

0

나는 당신이 왜 이것을하고 싶은지 다시 생각할 필요가 있다고 생각한다. 당신이 제안하는 것이 심지어 자바 개념으로 존재하지 않기 때문이다.

this 변수는 항상 개체 자체를 참조합니다. 참조 (결국, 이전 개체 대신 null을 가리키는 참조를 지정했기 때문에 개체를 "무효화"할 수는 없습니다.) 으로 으로 항상 범위의 현재 개체를 가리키는 포인터를 사용하면 의미가 없습니다.

강제로 개체를 파괴하려고합니까/가비지 수집합니까? 그렇다면 코드의 다른 부분이 여전히 참조를 가지고있는 동안 그렇게 할 수 없습니다. 참조가 없으면 가비지 수집됩니다.

어쨌든 당신이 무엇을 희망 했습니까/생각 했습니까?

0

코드는 ..

The left-hand side of an assignment must be a variable 

this

변수의 키워드 아니다 .. 시간 오류 .. 사촌을 컴파일

this=null; 
1

를 얻을 나는 이것이 좋은 질문이라고 생각해야합니다. 저는 Object가 건설 후/건설 중 유효성을 검사하고 이유를 찾은 경우 빈 값을 반환하거나 스택을 백업하고 해당 객체를 만드는 것을 건너 뛰는 경우가 많은 경우가있었습니다.

대부분 다른 값 목록에서 개체 목록을 만드는 경우입니다. 값이 가비지이며 객체가 이것을 인식하게하려는 경우.

대신 클래스 자체 외부에서 함수를 작성하여 유효성을 검사해야만 객체가이를 수행 할 수 있습니다.

자바가 프로그래머가 아마 엉망이 될 것이라는 가정에서 이것을 허용하지 않는 것은 부끄러운 일입니다. 코드를 작성하면 좋은 기능이 될 것입니다.

관련 문제