код библиотеки в нужное время.

о не менее 5 лет с тех пор, как я работал с Java, и тогда, когда бы вы ни захотели выделить объект, который необходимо очистить (например, сокеты, дескрипторы БД), вы должны были не забыть добавитьfinally заблокировать и вызвать метод очистки там.

Напротив, в C ++ (или других языках, где время жизни объекта детерминировано, например, Perl), разработчик класса определит функцию деструктора, которая выполняет очистку всякий раз, когда объект этого класса выходит из области видимости. Преимущество этого подхода состоит в том, что пользователь объекта не может забыть очистить его - деструктор вызывается автоматически, даже если выдается исключение. Этот подход называется довольно ужасным названием RAII - «Приобретение ресурсов - инициализация».

По моему опыту, выполнение «пути RAII» избавило меня от лишних мыслей, так как мне не нужно было беспокоиться о том, когда и когда произойдет освобождение ресурсов. Мы рассматриваем возможность использования Java для проекта среднего размера, и мне интересно, входит ли какое-то детерминированное разрушение в число многих новых функций, добавленных в язык с тех пор, как я в последний раз смотрел его. (Я надеюсь, что моя жалоба на то, что "Java не имеет RAII" была осужденав этой теме, но до сих пор я не смог найти какие-либо детали, прибегая к помощи.)

Так что, если бы кто-то мог указать мне на некоторый вводный материал о том, как сделать это на Java, это было бы здорово!

 j_random_hacker23 апр. 2015 г., 13:56
@Raedwald: Хотя мой вопрос действительно дублирует тот, на который вы ссылались, я заметил, что ответ, получивший наибольшее количество голосов и принятый, утверждает, что, поскольку Java использует GC, онне мог иметь детерминистическое разрушение. Но комментарии под ответом Джона Скита показывают, что эти две вещи не противоречат друг другу, что я считаю интересным и полезным. (Конечно, это может быть только мой личный разговор ;-)
 Raedwald23 апр. 2015 г., 08:04
возможный дубликатЕсть ли деструктор для Java?

Ответы на вопрос(4)

который помогает. Это не так хорошо, как RAII на основе деструктора, но это означает, что очистка ресурса может быть перемещена в библиотеку (так что вы не можете забыть вызвать ее).

Это называетсяВыполните вокруг, и обсуждалось здесь раньше.

Интересно, что я вижу, как Джон Скит вмешивался в эту тему, но он не упомянул об этом здесь - как вам не стыдно, Джон - упустил возможность получить несколько очков репутации там!

Кстати, хотя я рад, что Брайан Гарри (снова см. Комментарий Джона) подробно описал то, что он написал, - и это, очевидно, отразило много мыслей, которые вошли в процесс, - и я рад, что мы это сделали. получить "использование" из этого в C # - я не согласен со всеми его выводами. В частности, я не понимаю, почему, если мы можем использовать использование, у нас не может быть способа пометить тип как ведущий себя таким образом без «использования». Конечно, это ограничивает использование - но также и использование - и в большинстве случаев это именно то, что вы хотите. Проблема с «использованием» заключается в том, что клиентский код все еще должен помнить, чтобы использовать его. В C ++ стиле RAII это свойство типа. Возможно, более серьезная проблема с «использованием», или, точнее, с идиомой Dispose, состоит в том, что это намного сложнее и подвержено ошибкам, чем большинство людей понимают, чтобы получить права - в основном из-за потенциальной возможности возвращения объектов из мертвых.

 philsquared14 февр. 2009 г., 18:52
Не уверен, что «хороший» - это термин, особенно в отсутствие синтаксиса замыкания - но он выполняет свою работу :-) Смотрите также мою публикацию в блоге на эту тему:metatechnology.blogspot.com/2007/02/...
 j_random_hacker14 февр. 2009 г., 14:32
Спасибо Фил, это очень хороший способ решить проблему в отсутствие детерминированных деструкторов.
 j_random_hacker15 февр. 2009 г., 14:47
@Phil: Конечно, синтаксис не совсем «хороший», но, как вы говорите, он выполняет свою работу. Интересная статья Кстати. Насколько я вижу, это на самом деле более общее решение, чем ctors / dtors, для языка с хорошей поддержкой замыкания.
Решение Вопроса

Ответ ниже был написан в начале 2009 года, когда Java 7 была все еще в движении.

Хотя Java все еще не дает гарантий относительно времени завершения, онасделал получить такую ​​функцию, как C #using утверждение:оператор проб с ресурсами.

Нет, Java в этом отношении не изменилась. Вам все еще нужно использовать try / finally.

Обсуждается добавление эквивалента оператора C # «using» (который является синтаксическим сахаром по сравнению с try / finally) в Java, но я не думаю, что это будет частью Java 7 больше. (Похоже, что большинство языковых улучшений упало.)

Стоит понять, что существуют причины, по которым детерминированное уничтожение не было реализовано в Java и .NET в виде сборщика мусора с подсчетом ссылок, кстати, - а) влияющего на производительность и б) терпящего неудачу с циклическими ссылками. Брайан Гарри написалподробный электронный адрес об этом - это о .NET, и он довольно старый, но его стоит внимательно прочитать.

 Jon Skeet24 июн. 2009 г., 20:15
@Earwicker: Каким образом C # имеет детерминированное разрушение?
 Jon Skeet29 сент. 2011 г., 07:26
@Mechanicalsnail: Да, я буду редактировать, спасибо.
 philsquared14 февр. 2009 г., 18:53
D удается иметь детерминированное разрушение в контексте GC - так что это может быть сделано
 Mechanical snail29 сент. 2011 г., 04:51
По всей видимостиэто было добавлено к 1.7.
 j_random_hacker25 янв. 2009 г., 10:55
Спасибо Джон. Интересно, что поддержка некоторых детерминированных классов / объектов требует детерминизма, «заражающего» все. В любом случае для меня важен случай с локальной областью видимости - «использование» - это шаг в правильном направлении, поскольку он обеспечивает согласованное именование деструкторов.

ожен в куче и может пережить любой блок, в котором он был инициализирован. Или он может быть собран в середине блока, в зависимости от капризов всего могущественного сборщика мусора.

Если вы работаете на сервере, вы можете проверитьJava EE, Он не имеет ничего общего с RAII, но у него есть достойная система для управления жизненными циклами дорогих объектов, таких как соединения с БД. Java EE 5 на самом деле довольно приятно работать для многих проблемных мест.

 drlolly14 сент. 2016 г., 10:57
Очень хороший ответ C ++ не имеет никакой сборки мусора, но вы можете избежать необходимости уничтожать с помощью простого способа размещения в стеке. Компилятор гарантирует, что вызовет деструктор независимо от того, как будет завершена область действия (обычным возвратом или исключением).
 j_random_hacker25 янв. 2009 г., 10:58
Спасибо, Джей. JEE звучит немного тяжеловесно для того, что нам нужно сделать, но я расскажу об этом остальным и посмотрю, что они думают.

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

Есть много библиотек, которые делают это. В большинстве случаев вам не о чем беспокоиться.

 j_random_hacker25 янв. 2009 г., 11:56
Спасибо, Питер, но меня беспокоит надежное выделение ресурса. Я не понимаю, как эту ответственность можно перенести в библиотеку - вам все равно нужно помнить, чтобы позвонитьэто код библиотеки в нужное время.

Ваш ответ на вопрос