Как всегда вызывать finalize () (мышление в упражнении на Java)

Я медленно работаю с Брюсом ЭккелемThinking in Java 4th editionи следующая проблема поставила меня в тупик:

Create a class with a finalize( ) method that prints a message. In main( ), create an object of your class. Modify the previous exercise so that your finalize( ) will always be called.

Вот что я кодировал:

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

Это создает новыйHorse объект с логическим значениемinStable установлен вfalse, Теперь вfinalize() метод, он проверяет, еслиinStable являетсяfalse, Если это так, он печатает сообщение.

К сожалению, сообщение не печатается. Поскольку условие оценивается какtrueя думаю, чтоfinalize() не вызывается в первую очередь. Я запускал программу несколько раз и видел сообщение об ошибке только пару раз. У меня сложилось впечатление, что когдаSystem.gc() При вызове сборщик мусора будет собирать любые объекты, на которые нет ссылок.

Погуглив правильный ответ дал мнеэта ссылка, что дает гораздо более подробный, сложный код. Он использует методы, которые я не видел раньше, такие какSystem.runFinalization(), Runtime.getRuntime(), а такжеSystem.runFinalizersOnExit().

Кто-нибудь может дать мне лучшее понимание того, какfinalize() работает и как заставить его работать, или проведите меня через то, что делается в коде решения?

Ответы на вопрос(5)

Ваш ответ на вопрос