Безболезненное управление ресурсами в Java - PullRequest
6 голосов
/ 12 сентября 2008

В C ++ мы получаем ресурс в конструкторе и освобождаем его в деструкторе.

Таким образом, когда исключение возникает в середине функции, не будет утечки ресурсов, заблокированных мьютексов или чего-либо еще.

AFAIK Java-классы не имеют деструкторов. Так как же сделать управление ресурсами в Java.

Например:

public int foo() {    
    Resource f = new Resource();
    DoSomething(f);
    f.Release();
}

Как освободить ресурс, если DoSomething выдает исключение? Мы не можем поместить блоки try \ catch во весь код, не так ли?

Ответы [ 5 ]

4 голосов
/ 23 октября 2011

Этот вопрос относится к 2008 году и, следовательно, относится к Java 6. С тех пор была выпущена Java 7, которая содержит новую функцию автоматического управления ресурсами. Для более недавнего вопроса, который имеет отношение к Java 7, посмотрите этот вопрос:

Java-техники для автоматического освобождения ресурса? "оперативная очистка"?

4 голосов
/ 12 сентября 2008

Да, вы можете и должны поставить блок try / catch / finally вокруг вашего кода. В C # есть сокращенное выражение «using», но в Java вы застряли с:

public int foo() {
    Resource f = new Resource();
    try {
        DoSomething(f);
    }
    finally {
        f.Release();
    }
}
2 голосов
/ 12 сентября 2008

Можно выделить 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 вы можете выполнить инструкцию, просмотреть результаты, закрыть ресурсы и обернуть исключение.

0 голосов
/ 12 сентября 2008

Извините, что разочаровал вас, но в Java мы делаем много используем блоки try \ catch \ finally. И под «много» я ​​имею в виду A LOT . Иногда мне хочется, чтобы в Java был блок C # using. Большую часть времени вам не потребуется освобождать ресурсы, так как сборщик мусора Java позаботится об этом.

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

0 голосов
/ 12 сентября 2008

Если вы хотите, чтобы блок using участвовал в обсуждении закрытия Java: S

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...