2012-08-27 2 views
0

를 파괴하는, 내가하고 싶은 :호출 객체 메소드가 다른 객체

lion.eat(prey) 

동안

lion.energy=energy+10,as an example. 
prey=null 

은 그러나 나는 또한 원하는 논리적 인 생태계에서 완전히 먹이를 파괴하십시오.

가비지 컬렉터에 대한 모든 정보와 가비지 수집기에 대한 모든 내용은 아무 것도 지적하지 않는대로 나중에 개체를 파괴합니다.

하지만 가상의 생태계에서 수백만 개의 사자 및 사슴 인스턴스가있는 유전자 알고리즘을 구현하고 있습니다. 이제 죽은 동물을 어떻게 제거합니까?

괴짜 농담이 아니므로 항상 가비지 수집기와 객체 살인과 같은 대답에 걸림돌이되어 버리는 것에 지쳐 있습니다. 나는 사자 메서드에서 먹이 객체를 논리적으로 역 참조하는 해답을 원합니다.

public class prey 
{ 
    int energy=10; 
} 

public class lion 
{ 
    int energy=0; 

    public void eat(prey aDeer) 
    { 
    this.energy=aDeer.energy+this.energy; ///acumulate energy values from prey 
    aDeer=null;//destroys the object from ecosystem, which seems impossible to do in java 
    } 
} 
+0

Java에서 수동 메모리 관리를 수행 할 수 없습니다. 한 번에 너무 많은 것이 할당되지 않는 것이 우려되면 재사용을 위해 캐시하지 않는 이유는 무엇입니까? – oldrinb

답변

1

당신은 이미 수백만 개의 먹이를 가지고 있습니다. 예 : ArrayList. ArrayList에서 항목을 제거하는 것은 매우 간단합니다. 그 .remove() 함수를 호출하십시오.

+0

수백만 개의 항목이있는 ArrayList에서 remove를 호출하는 것은 간단하지만 효율적이지 않습니다. 그러나 set을 사용하는 수백만 항목의 경우 훨씬 더 빠를 수는 없습니다 (훨씬 빠르지 만 메모리 집약적이지만 수용할만한 수준 일 수 있습니다).그러나 이것은 엔티티를 효과적으로 저장하고 조작하는 것에 관한 것이지 엔티티를 제거하는 방법에 관한 것이 아닙니다. – Alpedar

0

이미 언급했듯이 Java에서 명시 적 메모리 관리를 수행 할 수 없습니다. 할 수있는 일은 아무런 참조로도 죽은 객체가 살아 있는지 확인하고 가비지 컬렉터가 그 일을 할 수있게하는 것입니다. 이는 작은 개체가 대량으로 파괴되는 경우 명시 적 메모리 관리보다 더 효율적일 수 있습니다.

인구의 전체 크기가 구성원이 태어나서 죽는 속도보다 훨씬 느리게 변화하는 경우 실제로 제안 된 것처럼 동물 풀을 유지하고 새 개체를 만드는 것이 아니라 그들이 태어날 때 당신의 웅덩이는 그들이 죽을 때 그곳으로 돌아갑니다.

0

오브젝트 생성 및 제거에 병목 현상이있는 경우 (프로파일 링으로 추측하지 않음), 모든 동물을 배열 (또는 최대 인구를 알 수없는 경우 배열을 허용 할 수 있도록 배열 목록에 넣을 수 있음) 색인 및 동물을 죽일 때 마지막 동물과 교환하고 살아있는 동물의 카운터를 줄입니다. 적은 단어로 이전에 제안 된대로 동물 풀을 만드십시오. 다음 세대에 동물이 거의 없다면 2 개의 어레이를 고려하여 이전 세대로 진행하고 새로운 세대로 살아가고 그 어레이를 전환하십시오.

그러나 유용하기 때문에 모든 동물 (동일한 배열에 있음)이 동일한 구조로되어 있어야하므로 한 번 사슴은 다음 번 토끼가 될 수 있습니다. 그래서 Animal, 또는 종마다 하나의 배열을 가지고 있습니다.

추신. 수동으로 파괴하는 방법을 찾으려하지 마라. 객체를 생성하고 파괴하는 것을 피하라. (특히 세대 크기가 크게 변하지 않는다면 모두가 다시 필요할 것이다.) 아니면 GC에 의존해야한다.

관련 문제