Как вы пишете деконструктор на Java? - PullRequest
1 голос
/ 16 марта 2010

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

Ответы [ 7 ]

15 голосов
/ 16 марта 2010

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

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

4 голосов
/ 16 марта 2010

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

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

2 голосов
/ 16 марта 2010

Автоматическое «уничтожение» объекта в Java никогда не происходит в гарантированное время. Единственным получателем гранта для сборки мусора является то, что перед сбором объекта будет вызван метод финализатора. Конечно, сборщик мусора никогда не может работать или делать что-либо, когда он работает. Таким образом, нет гарантии, что метод finalize будет вызван.

Если вы хотите симулировать деструкторы C ++ в Java, лучше всего использовать следующую идиому (есть варианты, когда дело доходит до обработки исключений - я просто покажу простейший случай здесь):

final Resource r;

r = new Resource();

try
{
    r.use();
}
finally
{
    r.cleanup();
}

где метод "cleanup" - это "деструктор".

Это больше похоже на идиому C ++ Resource Acquisition - Инициализация, которая действительно предназначена для стековых объектов, но не так хороша.

2 голосов
/ 16 марта 2010

Если вам просто нужно очистить некоторые ресурсы, вы можете вызвать Runtime.getRuntime (). AddShutdownHook

1 голос
/ 16 марта 2010

Вы можете проверить это для получения дополнительной информации о завершении - finalize () метод

0 голосов
/ 31 декабря 2015

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

0 голосов
/ 16 марта 2010

Поскольку другие говорят о нормальных случаях. Существуют особые случаи, когда вы хотите создать destroy(), destruct(), releaseExternalResources(), shutdown() и т. Д., Которые должны активно называться . субъектом, который контролирует жизненный цикл этого экземпляра.

Например, объект может быть ActiveObject, в котором есть живые потоки. В этом случае вы хотите закрыть их, потому что иначе у вас будут утечки памяти.

Хотя нельзя называть это деструктором ...

Я полагаю, что вопрос об интервью был задуман как вопрос с подвохом!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...