Безболезненное управление ресурсами в Java
Вопрос
В C++ мы получаем ресурс в конструкторе и освобождаем его в деструкторе.
Таким образом, когда в середине функции возникает исключение, не будет утечки ресурсов, заблокированных мьютексов или чего-то еще.
Классы Java AFAIK не имеют деструкторов.Итак, как же осуществлять управление ресурсами в Java?
Например:
public int foo() {
Resource f = new Resource();
DoSomething(f);
f.Release();
}
Как можно освободить ресурс, если DoSomething выдает исключение?Мы не можем размещать блоки try\catch по всему коду, не так ли?
Решение
Да, вы можете и должны поместить блок try/catch/finally вокруг своего кода.В C# есть сокращенное выражение «using», но в Java вы застряли:
public int foo() {
Resource f = new Resource();
try {
DoSomething(f);
}
finally {
f.Release();
}
}
Другие советы
Этот вопрос датируется 2008 годом и, следовательно, относится к Java 6.С тех пор была выпущена Java 7, которая содержит новую функцию автоматического управления ресурсами.Более свежий вопрос, относящийся к Java 7, см. в этом вопросе:
Java-методы для автоматического выпуска ресурсов?"оперативная уборка"?
Можно исключить try/finally (а также исключения и алгоритмы), используя идиому «Выполнить вокруг».Однако синтаксис очень многословен.
public int foo() {
withResource(new WithResource() { public void run(Resource resource) {
doSomething(resource);
}});
}
...
public interface WithResource {
void run(Resource resource);
}
public static void withResource(WithResource handler) {
Resource resource = new Resource();
try {
handler.run(resource);
} finally {
resource.release();
}
}
Подобные вещи имеют больше смысла, если вы больше абстрагируете, чем пытаетесь/наконец-то.Например, с помощью JDBC вы можете выполнить оператор, просмотреть результаты, закрыть ресурсы и обернуть исключение.
Если вы хотите, чтобы блок using участвовал в дебатах о закрытии Java: S
Извините, что разочаровал вас, но на Java мы делать использование try\catch\finally часто блокирует.И под "много" я имею в виду МНОГО.Иногда мне хочется, чтобы в Java был блок using C#.В большинстве случаев вам не потребуется освобождать ресурсы, поскольку об этом позаботится сборщик мусора Java.
Однако исключения имеют свое применение, делая обработку ошибок намного чище.Вы можете написать свои собственные исключения и перехватывать их для всего, что вы делаете.Больше не нужно возвращать пользователю произвольные коды ошибок!