Я столкнулся с этим вопросом и искал некоторые идеи?
Как вы пишете деконструктор в Java?
Ответ 1
Вам не нужны (и вы не должны пытаться использовать) деструкторы - или то, что они вызывают в Java: "Финализаторы".
Спецификация VM позволяет реализаторам VM никогда не называть их. Поэтому они не надежны для выпуска ресурсов и т.п. Вообще говоря, код в методе finalize()
любого объекта может быть вызван виртуальной машиной до того, как объект будет собран мусором, но поскольку это не является обязательным, его следует избегать.
Ответ 2
Java - сбор мусора, поэтому нет способа узнать, когда будет вызван ваш деструктор (когда ваш объект будет собран с помощью мусора).
Существует метод finalize
(унаследованный), но вы не можете полагаться на это по указанным выше причинам (вы не можете предсказать, когда - и if - он будет вызываться).
Ответ 3
Если вам просто нужно очистить некоторые ресурсы, вы можете вызвать Runtime.getRuntime(). addShutdownHook
Ответ 4
Автоматическое уничтожение объекта в Java никогда не происходит в гарантированное время. Единственными грантодателями для сбора мусора являются то, что до того, как объект будет собран, будет вызываться метод финализатора. Конечно, сборщик мусора никогда не будет гарантированно бежать или что-либо делать, когда он запускается. Таким образом, нет никакой гарантии, что будет вызываться метод finalize.
Если вы хотите имитировать деструкторы С++ в Java, лучший способ - использовать следующую идиому (есть варианты, когда она подходит к обработке исключений - здесь я просто покажу простейший случай):
final Resource r;
r = new Resource();
try
{
r.use();
}
finally
{
r.cleanup();
}
где метод "очистки" является "деструктором".
Это больше похоже на С++ Resource Acquisition Is Инициализация idiom, которая действительно для объектов на основе стека, но не так хороша.
Ответ 5
Вы можете проверить это для получения дополнительной информации о завершении - метод finalize()
Ответ 6
Так как другие говорят о нормальных случаях. Существуют особые случаи, когда вы хотите создать методы destroy()
, destruct()
, releaseExternalResources()
, shutdown()
и т.д., которые должны активно вызываться сущностью, которая управляет жизненный цикл этого экземпляра.
Например, объектом может быть объект ActiveObject, в котором есть живые потоки. В этом случае вы хотите закрыть их, потому что иначе у вас будет утечка памяти.
Хотя нельзя назвать это деструктором...
На боковой панели, я думаю, этот вопрос интервью был задуман как вопрос трюка!
Ответ 7
Попытки с ресурсами доступны с Java 1.7
Все, что наследуется от Closeable
или Autocloseable
, может использовать его.
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
try (FileReader br = new FileReader(path)) {
return br.readLine();
}
Это автоматически вызовет функцию close
, которая, как гарантируется, будет вызываться в конце блока.