Я медленно работаю через Bruce Eckel. Думаю, в четвертом выпуске Java, и следующая проблема меня озадачила:
Создайте класс с методом finalize(), который печатает сообщение. В main() создайте объект своего класса. Измените предыдущее упражнение так, чтобы ваш finalize() всегда вызывался.
Это то, что я закодировал:
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()
и как заставить его работать, или пройти через то, что делается в коде решения?