Как сказал Цаман, секрет наконец используется; в целом:
Resource r = allocateResource();
try {
// use resource
}
finally {
r.dispose();
}
Что следует отметить здесь:
- попробуйте и, наконец, каждый создайте переменную область видимости. Таким образом, распределение вашего ресурса в предложении try не будет работать, так как оно не будет видно в предложении finally - вы должны объявить переменную ресурса перед оператором try.
Если у вас есть несколько ресурсов для распределения, общий шаблон применяется чисто, но это часто не очевидно для начинающих:
Resource1 r1 = allocateResource1();
try {
// code using r1, but which does not need r2
Resource r2 = allocateResource2();
try {
// code using r1 and r2
}
finally {
r2.dispose();
}
}
finally {
r1.dispose();
}
, и так далее, и так далее, если у вас есть больше ресурсов для распределения. Если у вас есть пара из них, у вас наверняка будет соблазн попытаться избежать глубоких вложений операторов try ... finally. Не. Вы можете получить правильное освобождение ресурсов и обработку исключений, не вкладывая так много операторов try ... finally, но понимая их правильно, не пытаясь выполнить ... finally даже хуже, чем глубокое вложение.
Если вам часто нужно использовать набор ресурсов, вы можете реализовать метод, основанный на функторе, чтобы избежать повторения, например:
interface WithResources {
public void doStuff(Resource1 r1, Resource2 r2);
}
public static void doWithResources(WithResources withResources) {
Resource r1 = allocateResource1();
try {
Resource r2 = allocateResource2();
try {
withResources.doStuff(r1, r2);
}
finally {
r2.dispose();
}
}
finally {
r1.dispose();
}
}
Что тогда вы можете использовать так:
doWithResources(new WithResources() {
public void doStuff(Resource1 r1, Resource2 r2) {
// code goes here
}
});
doWithResources автоматически будет правильно обрабатывать распределение и освобождение, и ваш код будет иметь меньше повторений (что хорошо). Однако:
- Синтаксис Java для анонимных классов слишком многословен
- Проверенные исключения в doStuff слишком усложняют
, два момента, которые, я надеюсь, будут решены в Java 7.
Такой код можно найти в Spring, например: