Jak upewnić się, że finalize () jest zawsze nazywane (Thinking in Java exercise)

Powoli pracuję nad Brucem EckelemMyślenie w Javie 4. edycja, a następujący problem mnie zablokował:

Utwórz klasę za pomocą metody finalize (), która drukuje komunikat. W main () utwórz obiekt swojej klasy. Zmodyfikuj poprzednie ćwiczenie, aby finalize () zawsze był wywoływany.

Oto, co zakodowałem:

public class Horse {
    boolean inStable;
    Horse(boolean in){
        inStable = in;
    }   
    public void finalize(){
        if (!inStable) System.out.print("Error: A horse is out of its stable!");
    }
}
public class MainWindow {
    public static void main(String[] args) {
        Horse h = new Horse(false);
        h = new Horse(true);
        System.gc();
    }
}

Tworzy nowyHorse obiekt z booleaninStable Ustawićfalse. Teraz wfinalize() metoda sprawdza, czyinStable jestfalse. Jeśli tak, drukuje wiadomość.

Niestety, żadna wiadomość nie jest drukowana. Ponieważ warunek się sprawdzatrue, zgaduję, że takfinalize() nie jest wywoływany w pierwszej kolejności. Uruchomiłem program wiele razy i widziałem komunikat o błędzie tylko kilka razy. Miałem wrażenie, że kiedySystem.gc() jest wywoływane, garbage collector będzie zbierał wszystkie obiekty, do których nie ma odniesienia.

Przekazałem mi poprawną odpowiedźten link, który daje znacznie bardziej szczegółowy, skomplikowany kod. Używa metod, których wcześniej nie widziałem, takich jakSystem.runFinalization(), Runtime.getRuntime(), iSystem.runFinalizersOnExit().

Czy ktoś jest w stanie lepiej zrozumieć, w jaki sposóbfinalize() działa i jak zmusić go do uruchomienia lub przeprowadzić mnie przez to, co jest robione w kodzie rozwiązania?

questionAnswers(5)

yourAnswerToTheQuestion