2010-11-20 7 views
1

내 프로그램에서 배열에 여러 객체가 저장되어 있습니다. 배열에 인덱스 인 숫자를 무작위로 생성하고 해당 객체 (9 번)를 복제하여 화면에 객체의 3x3 격자를 만듭니다.Java에서 객체 삭제

내 문제는 내 3x3 그리드를 지우고 배열을 지우고 개체의 새로운 그리드를 생성 할 수 있기를 바랍니다. 문제는 기억을 낭비하는 것처럼 보이게하는 것을 제외하고는이 복제물을 제거하는 방법을 생각할 수 없다는 것입니다. 나는 400 번의 시련처럼하고 싶다. 결국 많은 복제품이 생길 것이다.

이러한 복제 된 개체를 삭제할 수있는 방법이 있습니까? 내 배열에있는 객체 중 하나가 그리드에서 두 번 사용 될 수 있기 때문에 새 객체를 만들어야합니다.

+0

로직과 디스플레이를 분리해야합니다. 그렇다면 이것은 문제가되지 않습니다.(현대적인 시스템에서, 어쨌든 칙칙하고 복잡한 개념이라 할지라도 문제가되지는 않을 것입니다.) –

답변

2

자바 가비지 컬렉터가 도움이 될 것이라고 생각합니다. 개체를 다른 사람이 참조하지 않으면 시스템에서이를 인식 할 때 개체가 삭제됩니다. 그러나 당신이 "디스플레이에서 그들을 내쫓"다고 할 때 당신은 무엇을 의미합니까? "그래픽 객체"인 경우 JFrame과 같은 다른 객체 안에 있어야하므로 JFrame 객체 (또는 다른 객체)에게 참조를 버리거나 참조를 다른 객체로 덮어 쓰도록 지시하는 메서드를 사용해야합니다.

0

실제 개체를 다루지 않고 메모리의 개체에 대한 포인터 또는 참조를 처리한다는 것을 알 수 있습니다. 따라서 :

Object obj = new Object(); 

은 메모리에있는 객체에 대한 링크가 아닙니다. 링크를 null로 설정하거나 링크를 다른 오브젝트로 대체하여 링크를 제거하면 이전 오브젝트가 삭제됩니다 ... ish. 가비지 수집이 실행되면 삭제됩니다. 그래서 :

obj = null; 

obj = new Object(); 

은 본질적으로 기존의 객체를 삭제합니다. 동일한 객체 배열에도 적용되지만 실제 객체의 배열이 아니라 객체에 대한 링크 배열을 처리합니다. 따라서 배열의 위치를 ​​null로 설정하거나 위치를 새 객체로 설정하면 이전 객체가 삭제됩니다. 그래서 :

ObjArray[4] = null; 

ObjArray[4] = new Object; 

이전 개체를 삭제합니다.

편집 : 내가 기억하는 것을 잊어 버린 것 같아요. 메모리의 단일 개체에 여러 개의 링크가있을 수 있으며 모든 링크가 제거 될 때까지 개체가 가비지 수집에서 삭제 될 위치에 있어야합니다. 에 대한 링크가 여전히 ObjArray에 존재하기 때문에 위의 경우

Object obj = new Object(); 
ObjArray[4] = obj; 
obj=null; 

, OBJ가 null로 설정하면 원래 삭제되지 않습니다 생성 된 객체는이입니다. 객체가 사라지기 전에 obj와 ObjArray [4]를 모두 null로 설정해야합니다.

+0

고마워요,하지만 코드를 작성하면 어떤 이유로 # Target t = new Target (x, y); t = null; 그런 다음 내 디스플레이에 그래픽이 여전히 표시되면 가비지 수집기가 작업을 수행하도록 강제 할 수 있습니까? – Douglas

+0

@Douglas Separate concern. 그러면이 말이 합리적입니다. –

+0

@Douglas, 여러 참조에 대한 답변에 조금 더 추가되었습니다. – phill

0

참조가 여전히 컨테이너 내부에 남아 있기 때문에. 내 생각 엔 당신이 다음과 같이 해왔다고 생각합니다 : myJFrameObject.getContentPane.add (object_to_display); 참조는 myJFrameObject 내부에 있으므로 myJFrameObject.getContentPane.remove를 사용할 수 있습니다. 원하는 경우 setVisible (false)을 사용하여 프레임을 숨길 수 있습니다. 그것은 상황에 달려 있습니다.