Я медленно работаю над книгой Брюса Экеля 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()
сборщик мусора соберет все объекты, на которые нет ссылок.
Поиск правильного ответа в Google дал мне эту ссылку , которая дает гораздо более подробный и сложный код. Он использует методы, которых я раньше не видел, такие как System.runFinalization()
, Runtime.getRuntime()
и System.runFinalizersOnExit()
.
Кто-нибудь может дать мне лучшее понимание того, как работает finalize()
и как заставить его работать, или объяснить мне, что делается в коде решения?