Jak używać destruktorów w Java

0

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 ;)

1

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>

0

No tak ale ja potrzebuje, zabić obiekt natychmiast. A to coś jakoś słabo działa, może coś żle robie ;/

0

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.

0

Spróbuj

on=null;

W niektórych klasach, (np. Frame, JFrame) masz metodę dispose().

0

Miało być

ob=null;
0
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.

0

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
0

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.

0
  1. finalize() bardzo mocno spowalnia alokację i dealokację obiektów
  2. Po cholerę chcesz "usuwać obiekty z pamięci" natychmiast?

1 użytkowników online, w tym zalogowanych: 0, gości: 1