Как лучше всего закрывать ресурсы?

У меня есть класс 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 это правильно.

Другие вопросы по тегам