Как лучше всего закрывать ресурсы?
У меня есть класс Java, который выделил ресурсы, которые должны быть закрыты. Я действительно не знаю, как обеспечить это, мой текущий подход заключается в реализации интерфейса AutoCloseable
, надеясь, что звонящий звонит close()
иногда и добавляя boolean
закрытый, который проверяется в начале каждого метода, и если true
метод бросает IllegalStateException
,
Оба, что звонящий должен позвонить close()
и то, что я должен проверить закрытые в начале каждого метода, не очень хорошо, есть ли лучшая практика, чтобы избежать этого?
1 ответ
Заставить ваш класс реализовать интерфейс AutoCloseable
Это хороший подход в вашем случае, так как позволяет использовать его в try-with-resource
заявление.
Если по какой-либо причине вы хотите ограничить риск того, что экземпляры вашего объекта не будут закрыты должным образом, чтобы избежать утечек, вы можете переопределить finalize
метод как следующий:
@Override
protected void finalize() throws Throwable {
try {
this.close();
} finally {
super.finalize();
}
}
ВНИМАНИЕ 1: Реализация finalize
Метод должен выполняться с большой осторожностью, так как он замедлит работу GC, поэтому вам нужно убедиться, что ваш код будет выполняться быстро.
ВНИМАНИЕ 2: finalize
метод не обязательно вызывается, поэтому не полагайтесь на него close
ваш объект для вас, это только помогает снизить риск, пользователи вашего объекта по-прежнему несут ответственность за close
это правильно.