Очистка ресурса Java перед уничтожением объекта
У меня следующая проблема, и я знаю, что вопросов уже много, но ни один из них не дает мне действительно удовлетворительного ответа! Я написал много вещей на C++, и этот язык предоставляет деструктор, а Java нет из-за сборки мусора.
Небольшое введение в мою ситуацию: я написал программное обеспечение, которое обращается к локальной базе данных Sqlite3. Я написал центральный синглтон-класс для доступа к этой базе данных. Несколько других классов обращаются к БД через этот класс-оболочку. Вот псевдокод этого класса-обёртки:
public class MyDbWrapper
{
private currentDbConnection;
public MyDbWrapper(dbPath)
{
// Open the database connection with given path
}
public readFromDb()
{
... // Uses the class member currentDbConnection
}
public writeToDb()
{
... // Uses the class member currentDbConnection
}
public closeDb()
{
...
}
}
Теперь мой вопрос: как я могу убедиться, что соединение с базой данных закрыто перед выходом из приложения? Да я уже реализовала AutoCloseable
интерфейс и да, я уже много работал с try-with-resources
, но из-за доступа нескольких классов это на самом деле не вариант! В C++ деструктор решил бы эту проблему, но возможный "эквивалент" в java метод finalize
не рекомендуется!
Так есть ли другие варианты, или я должен полностью изменить дизайн моей полной оболочки? Если да, как я могу предотвратить проблемы с производительностью из-за большого количества прав на чтение и запись, если я каждый раз заново открываю базу данных?
1 ответ
Как уже сказал Joker_vD, я решил эту проблему с помощью оператора try-with-resources в основном методе моей программы...
public static void main(String [] args)
{
try(MyDbWrapper wrapper = new MyDbWrapper())
{
// Execute other task with usage of the database wrapper
}
}
В этом решении нет необходимости использовать деструктор или использовать устаревший метод finalize()
, соединение с базой данных закрывается, если программа заканчивается...