Инициализация одноразовых ресурсов снаружи или внутри попробуйте / наконец - PullRequest
3 голосов
/ 20 января 2009

Я видел два способа приобретения и распоряжения ресурсами. Или:

Resource resource = getResource();
try { /* do something with resource */ }
finally { resource.close(); }

или

Resource resource = null;
try { resource = getResource(); /* do something with resource */ }
finally { if (resource != null) resource.close(); }

Мне было интересно, какой стиль предпочтительнее. Первый избегает условия if, а второй (я полагаю) обрабатывает случай прерывания потока сразу после назначения, но до входа в блок try. Какие еще плюсы и минусы имеют эти стили друг над другом? Какой из них лучше использовать?

Ответы [ 3 ]

6 голосов
/ 20 января 2009

В C # просто используйте оператор using:

using (Resource resource = GetResource())
{
    /* Do something */
}

Нет риска прерывания потока в Java между назначением и входом в блок try - прерывания происходят только во время сна и ожидания. РЕДАКТИРОВАТЬ: Я не могу найти это в спецификации, что несколько беспокоит. Хм.

4 голосов
/ 20 января 2009

первый предпочтительнее

0 голосов
/ 20 января 2009

Если getResource () выдает исключение, тогда resource будет нулевым, getResource () не возвращает ничего в случае исключения. Таким образом, пока getResource () может выдавать исключение, всегда проверяйте нулевое значение перед вызовом resource.close () . Я считаю, что лучший способ организовать этот код - это поместить все в блок try; проясните, что getResource () генерирует исключения.

...