Usuwanie obiektu w Javie?


99

Chcę usunąć utworzony przez siebie obiekt (owal, który podąża za tobą), ale jak mam to zrobić?

delete follower1;

nie zadziałało.

EDYTOWAĆ:

OK, podam więcej kontekstu. Tworzę małą grę z owalem, który możesz kontrolować, i owalem, który podąża za tobą. Teraz mam pliki o nazwie: DrawPanel.class, ta klasa rysuje wszystko na ekranie i obsługuje kolizje, dźwięki, itp. Otrzymałem parent.class, czyli owal podążający za graczem. Otrzymałem entity.class, czyli gracza, którym możesz sterować. A jeśli gracz przecina się z obserwującym, chcę, aby mój obiekt gracza został usunięty. Sposób, w jaki to robię:

    public void checkCollisions(){
    if(player.getBounds().intersects(follower1.getBounds())){
        Follower1Alive = false;
        player.health = player.health - 10;
    }
}

1
czy możesz podać trochę więcej kontekstu?
Joseph Weissman

2
W Javie nie ma usuwania obiektów. Ale normalnie nie musisz: to, co musisz, to upewnić się, że nic nie jest wyświetlane na ekranie (jeśli to właśnie robi „podążanie za tobą”).
Paŭlo Ebermann

Może chcesz spróbować zmusić garbage collectora do usunięcia obiektu? nie ma mowy o tym tutaj już. A może próbujesz czegoś innego? możesz spróbować poczytać trochę o zbieraczu śmieci tutaj lub tutaj. Jeśli nadal nie ma on pomocy, musisz być bardziej szczegółowy.
Fawix

możliwy duplikat
wymuszonego

Jeśli naprawdę naprawdę chcesz ręcznie obsługiwać alokacje obiektów, użyj JNI: utwórz bibliotekę C / C ++, która jest używana z kodu Java, ale robi wszystko (tworzenie, usuwanie itp.) Samodzielnie - ale w swojej bibliotece masz C / Kod C ++, bez Java. Nie widziałem żadnego sposobu na ręczne usunięcie obiektu Java. Jeśli Twój profiler mówi Ci, że są problemy, problemy te często opierają się na „zapomnianych” odniesieniach do obiektów. W twoim przypadku nigdzie nie ma problemu.
Johannes,

Odpowiedzi:


172

Powinieneś usunąć odniesienia do niego, przypisując null lub opuszczając blok, w którym został zadeklarowany. Następnie zostanie automatycznie usunięty przez garbage collector (nie natychmiast, ale ostatecznie).

Przykład 1:

Object a = new Object();
a = null; // after this, if there is no reference to the object,
          // it will be deleted by the garbage collector

Przykład 2:

if (something) {
    Object o = new Object(); 
} // as you leave the block, the reference is deleted.
  // Later on, the garbage collector will delete the object itself.

Nie jest to coś, czego obecnie szukasz, ale FYI: możesz wywołać moduł odśmiecania za pomocą wywołania System.gc ()


23
Konieczność ręcznego dzwonienia na System.gc()ogół nie jest dobrym pomysłem , ponieważ maszyna JVM może to zignorować.
cdeange

3
Nie jest to dobry pomysł, ale możesz również wywołać coś podobnego do System .. Runtime.getRuntime (). Gc (). Więcej informacji: procedury usuwania elementów bezużytecznych dostarczane przez Javę są elementami klasy Runtime. Klasa Runtime to specjalna klasa, która ma jeden obiekt (Singleton) dla każdego programu głównego. Obiekt Runtime udostępnia mechanizm bezpośredniej komunikacji z maszyną wirtualną. Aby pobrać instancję Runtime, możesz użyć metody Runtime.getRuntime (), która zwraca Singleton.
Timo

1
Czy nullprzypisanie do GC wyraźnego znaku, że ten obiekt ma zostać Garbaged Cleaned w następnym wywołaniu GC? * Przypisanie nulldo obiektów kolekcji (List, Arrays) oznacza je do czyszczenia? stackoverflow.com/questions/449409/…
George Daramouskas

Dlatego powinienem wyzerować wszystkie moje widoki tekstu i przyciski obrazów na wartość onPause?
Ruchir Baronia

Nie ma gwarancji, że moduł odśmiecania pamięci kiedykolwiek się uruchomi, ani że jeśli tak się stanie, zbierze (a nie „usunie”) dowolny określony obiekt.
Markiz Lorne

64

Twój C ++ jest wyświetlany.

W deleteJavie nie ma , a wszystkie obiekty są tworzone na stercie. JVM ma moduł odśmiecania pamięci, który opiera się na liczbie odwołań.

Gdy nie ma już odniesień do obiektu, staje się on dostępny do pobrania przez moduł odśmiecania pamięci.

myObject = nullmoże tego nie zrobić; na przykład:

Foo myObject = new Foo(); // 1 reference
Foo myOtherObject = myObject; // 2 references
myObject = null; // 1 reference

Wszystko to polega na ustawieniu odwołania myObjectna null, nie ma to wpływu na obiekt, na myObjectktóry był wskazywany, z wyjątkiem prostego zmniejszenia liczby referencji o 1. Ponieważ myOtherObjectnadal odwołuje się do tego obiektu, nie jest jeszcze dostępny do zebrania.


Dlatego powinienem wyzerować wszystkie moje widoki tekstu i przyciski obrazów na wartość onPause?
Ruchir Baronia

8
„JVM ma moduł odśmiecania pamięci, który opiera się na liczbie odwołań”. -> to bardzo uproszczone wyjaśnienie. Sprawdza, czy obiekty są osiągalne z określonego „korzenia”
Johannes

2
JVM ma moduł odśmiecania pamięci, który w szczególności nie opiera się na liczbie odwołań. Opiera się na osiągalności. Gdyby opierał się na zliczeniach referencyjnych, nigdy nie zbierałby cykli i tak jest.
Markiz Lorne

14

Jeśli chcesz pomóc obiektowi odejść, ustaw jego odwołanie na null.

String x = "sadfasdfasd";
// do stuff
x = null;

Ustawienie odniesienia na wartość null zwiększy prawdopodobieństwo, że obiekt zostanie wyrzucony do pamięci, o ile nie ma innych odwołań do obiektu.


Ilekroć to zrobię, kiedy mój obiekt się przecina, cała moja gra się zawiesi i nie usunie obiektu.
Stan

Ponieważ prawdopodobnie zgłaszasz nieprzechwycony wyjątek wskaźnika zerowego. Szerszy kontekst z pewnością pomógłby nam przez to przejść.
Joseph Weissman

Dlatego powinienem wyzerować wszystkie moje widoki tekstu i przyciski obrazów na wartość onPause?
Ruchir Baronia

Jeśli naprawdę chcesz, żeby odeszły, to w końcu to wystarczy.
John Percival Hackworth,

3

Nie musisz usuwać obiektów w java. Gdy nie ma odniesienia do obiektu, zostanie on automatycznie zebrany przez moduł odśmiecania pamięci.


Dlatego powinienem wyzerować wszystkie moje widoki tekstu i przyciski obrazów na wartość onPause?
Ruchir Baronia

0

Możesz usunąć odniesienie za pomocą null.

Powiedzmy, że masz klasę A:

A a = new A();
a=null;

Ostatnia instrukcja usunie odniesienie do obiektu, aa ten obiekt zostanie „wyrzucony” przez JVM. To jeden z najłatwiejszych sposobów na zrobienie tego.


Dlatego powinienem wyzerować wszystkie moje widoki tekstu i przyciski obrazów na wartość onPause?
Ruchir Baronia


-6
//Just use a List
//create the list
public final List<Object> myObjects;

//instantiate the list
myObjects = new ArrayList<Object>();

//add objects to the list
Object object = myObject;
myObjects.add(object);

//remove the object calling this method if you have more than 1 objects still works with 1
//object too.

private void removeObject(){
int len = myObjects.size();
for(int i = 0;i<len; i++){
Objects object = myObjects.get(i);
myObjects.remove(object);
}
}

Powodem, dla którego ta odpowiedź jest niepoprawna, jest to, że usuwa tylko odniesienie do obiektu, a nie sam rzeczywisty obiekt.
Ben Morris,

Powód, dla którego ta odpowiedź jest niepoprawna, ponieważ pokazuje, jak usunąć obiekt z listy - to nie było pytanie.
phil
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.