Czy java ma coś takiego jak destruktor. Chce zabić obiekt. Jak się je wywołuje, i co powinienem wiedzieć o ich używaniu (jeśli takie istnieją)? dzięki są odpowiedz ;)
Nie wiem czy istnieje coś takiego jak destruktor który wywołujesz na danym obiekcie. Ale na pewno java posiada coś takiego jak Garbage Collector który automatycznie sam usuwa z pamięci nie potrzebne obiekty. Tylko jest problem bo działa on automatycznie i nie wiadomo kiedy przystąpi do zwalniania pamięci ale jest na to sposób można wymusić jego działanie:
System.gc()</code>
No tak ale ja potrzebuje, zabić obiekt natychmiast. A to coś jakoś słabo działa, może coś żle robie ;/
Dodajesz do obiektu metodę (np. dispose()) i wywołujesz ją, gdy obiekt nie jest potrzebny. Tak jest to zrobione np. w przypadku klasy JFrame.
W moim dwuletnim doświadczeniu z tym językiem musiałem to zrobić może 2, czy 3 razy. Pamiętaj, że obiekt jest usuwany automatycznie, gdy nie ma do niego żadnych referencji. Jeżeli chcesz się pozbyć obiektu, to usuń wszystkie referencje.
Spróbuj
on=null;
W niektórych klasach, (np. Frame, JFrame) masz metodę dispose().
Miało być
ob=null;
krzysztof85 napisał(a)
Nie wiem czy istnieje coś takiego jak destruktor który wywołujesz na danym obiekcie. Ale na pewno java posiada coś takiego jak Garbage Collector który automatycznie sam usuwa z pamięci nie potrzebne obiekty. Tylko jest problem bo działa on automatycznie i nie wiadomo kiedy przystąpi do zwalniania pamięci ale jest na to sposób można wymusić jego działanie:
System.gc()</code>
Uscislajac powyzsze: Java nie oferuje mechanizmu destruktora znanego chociazby z C++. Jego czesciowa funkcjonalnosc zostala przeniesiona na chroniona metode Object.finalize(), ktorej wywolanie (przez GC, co najwyzej raz) jest gwarantowane przez specyfikacje i to w niej ew. nalezaloby po sobie "posprzatac".
Podany System.gc(), z kolei, nic nie wymusza. Programista moze co najwyzej poskarzyc sie do JVM na GC, ze ten leci w kulki i dopiero JVM moze zdecydowac o zagonieniu go do pracy. Rownie dobrze moze takie wywolanie zignorowac.
Hmm, może takie coś byłoby dobre.
// UWAGA kodu nie kompilowałem
class Klasa {
private boolean final = false;
public void clear() {
if(!final) {
// Tutaj to co musisz obowiązkowo "zabić"
this.final = true;
}
}
.... finalize() {
this.clear();
System.out.println("Zwolnienie pamięci nastąpi za moment");
}
}
Klasa k = new Klasa();
// Jeżeli chcesz natychmiast uporządkować - przygotować obiekt do zabicia
k.clear();
k = null;
System.gc();
//To w zasadzie wszystko co możesz zrobić
// Jeżeli natomiast powierzasz wszystko Garbage Collectorowi to wystarczy
// w tym przypadku
k = null;
System.gc();
// Jeżeli nie jest to jakiś skrajny przypadek to w praktyce to zwolnienie następuje
// dosyć szybko o czy można się przekonać np wypluwając coś na ekran w metodzie finalize
Metoda finalize() nadaje się jedynie do odśmiecania niestandardowej pamięci!
Nie powinna być używana w sposób w jaki używany jest destruktor znany z C++. Tak że powyższy kod należy uznać za błędny. finalize() jest wywoływane tylko w przypadku gdy system wykryje brak zasobów.
NIE MA pewności że finalize() zostanie wywołane nawet w przypadku porzucenia referencji do obiektu. Jeżeli zasobów jest dużo, obiekt bez referencji może sobie dalej siedzić w pamięci a finalize() może nigdy nie zostać wywołane.
Musisz utworzyć metodę nazwij ją sobie jak destruct() albo cleanUp() i w niej przeprowadzić sprzątanie. Metoda ta musi być wywoływana ręcznie.
W praktyce finalize() przydaje się jedynie przy wywoływaniu metod natywnych. Metody natywne to sposób na wywołanie z javy kodu nie napisanego w javie.
- finalize() bardzo mocno spowalnia alokację i dealokację obiektów
- Po cholerę chcesz "usuwać obiekty z pamięci" natychmiast?