Безболезненное управление ресурсами в Java

StackOverflow https://stackoverflow.com/questions/58547

  •  09-06-2019
  •  | 
  •  

Вопрос

В 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.

Однако исключения имеют свое применение, делая обработку ошибок намного чище.Вы можете написать свои собственные исключения и перехватывать их для всего, что вы делаете.Больше не нужно возвращать пользователю произвольные коды ошибок!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top