Как обеспечить, чтобы финализация ()всегда называлась (Упражнение «Мышление в 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()он проверяет, является ли inStablefalse. Если это так, он печатает сообщение.

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

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

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

15
задан MattDs17 26 July 2015 в 17:14
поделиться