Мне задали этот вопрос в интервью.
Есть класс, давайте назовем его A
.Он имеет конструктор по умолчанию и инициализирует в своем конструкторе 2 разных соединения.
Методы initDB
& initSocket
создает соединение с БД и соединение с сокетом и сохраняет их в поле экземпляра. Это всего лишь пример.Они также могут быть открыты, или что-то еще.
Допустим, клиент создает экземпляр этого класса.Теперь initDB
выполнен успешно, но initSocket
сгенерировал исключение.Таким образом, создание объекта было прервано.Но соединение с БД не было закрыто до исключения.Это привело к утечке ресурсов.Как бы я справился с такой утечкой ресурсов?
Например:
class A {
public A(){
this.dbConnection = initDB();
this.socketConnection = initSocket(); // throws exception
}
}
Мой первоначальный ответ состоял в том, что я бы не инициализировал их в конструкторе, а в отдельном init()
.Он возразил, предположив, что это может быть унаследованный класс, и меня попросили поддержать это.В этом случае мне нужно как-то устранить утечку ресурсов.Как бы я подошел к этой проблеме?
Я был озадачен, потому что создание экземпляра вызвало исключение. Я потерял какую-либо ссылку на эти поля подключения.Поэтому я не могу назвать close()
на них.Но они все равно будут присутствовать на уровне ОС (это мое предположение).
Примечание 1
Как заявил интервьюер, Я не могу изменить поведение уже написанного конструктора. Я могу расширять или что-то делать с этим, но не могу изменить код.
Примечание 2
Я думаю, что интервьюер не искал явно никакого кода, который бы обрабатывал этот сценарий.Поможет ли какой-нибудь материал JMX?Я поверил в это, и затем мы пошли дальше.Для тех, кто думает, что это очень хороший вопрос, я думаю, что интервьюер знал, что это не обычная практика и, вероятно, не сможет ответить.