Как добиться симметрии конструктор / деструктор для Java - PullRequest
0 голосов
/ 10 марта 2019

Исходя из фона C ++, мне нравится иметь некоторую "симметрию" в построении и разрушении объектов.Например, construtor выделяет ресурсы, присоединяет обработчики событий, а деструктор отключает обработчики событий и освобождает ресурсы в обратном порядке в качестве конструктора.

В C # я обычно использую шаблон «Dispose» для созданиятакое поведение.Я не использую деструктор, потому что последний может вызываться из случайного потока (насколько я понял), что может быть проблемой, если деконструкция моих объектов содержит вызовы пользовательского интерфейса.

Как я могу имитироватьтакое поведение в Java?Разве Java не подходит для этого?Java предпочитает другой подход, чем этот?Я не хотел бы использовать Java по-другому, чем он был разработан для использования.

Я искал на SO, но люди говорят, что не существует такого понятия, как деструктор (который я уже знал)или метод, подобный Dispose.Есть ли способ реализовать эту "симметрию" конструкции / разрушения без того, чтобы сборщик мусора вызывал часть разрушения из случайного потока?Или я смотрю на вещи неправильно?Спасибо.

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

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

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

Как следует из другого ответа, наиболее близкая языковая функция, которая обеспечивает «некоторую степень контроля», фактически реализует интерфейс AutoCloseable.

2 голосов
/ 10 марта 2019

Самое близкое к тому, что вы ищете, это реализовать Closeable или AutoCloseable, а затем использовать ваш класс в блоке try-with-resources (или вызывать .close () самостоятельно в блоке finally). Но убедитесь, что вы делаете это для вещей, которые на самом деле являются дефицитными ресурсами, которые необходимо очистить как таковые.

...