Как вы пишете деконструктор в Java?

Я столкнулся с этим вопросом и искал некоторые идеи?

Ответ 1

Вам не нужны (и вы не должны пытаться использовать) деструкторы - или то, что они вызывают в Java: "Финализаторы".

Спецификация VM позволяет реализаторам VM никогда не называть их. Поэтому они не надежны для выпуска ресурсов и т.п. Вообще говоря, код в методе finalize() любого объекта может быть вызван виртуальной машиной до того, как объект будет собран мусором, но поскольку это не является обязательным, его следует избегать.

Ответ 2

Java - сбор мусора, поэтому нет способа узнать, когда будет вызван ваш деструктор (когда ваш объект будет собран с помощью мусора).

Существует метод finalize (унаследованный), но вы не можете полагаться на это по указанным выше причинам (вы не можете предсказать, когда - и if - он будет вызываться).

Ответ 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, которая, как гарантируется, будет вызываться в конце блока.