Как правило, я всегда видел try-with-resources, которые были использованы для размещения экземпляра нового объекта, метод close()
которого вызывается, поскольку он выходит за пределы области видимости.
Насколько я могу судить, создание нового объекта не является требованием, и синтаксису try-with-resources просто нужна локальная переменная для вызова функции close(), когда это выходит за пределы области видимости. Поэтому вы можете использовать его для управления "сопряженными операциями", такими как выделение чего-либо из пула и обеспечение его возврата.
Например, MyHandle ниже показывает, как выпустить объединенный экземпляр, когда он вам больше не нужен:
// init
class MyHandle implements AutoCloseable {
boolean inUse = false;
public MyHandle allocate() {
inUse = true;
return this;
}
public void close() {
inUse = false;
}
}
MyHandle[] pool = new MyHandle[POOL_SIZE];
for (int i = 0; i < pool.length; i++) {
pool[i] = new MyHandle(i);
}
// allocate
MyHandle allocateFromPool() {
for (int i = 0; i < pool.length; i++) {
if (!pool[i].inUse)
return pool[i].allocate();
}
throw new Exception("pool depleted");
}
// using resources from the pool
try (MyHandle handle = allocateFromPool()) {
// do something
}
// at this point, inUse==false for that handle...
Является ли это плохой формой?
EDIT: Думаю, я спрашиваю, есть ли альтернативы построению такой логики или если есть какой-то главный недостаток, когда вы идете с подходом выше. Я считаю, что использование этого в библиотеке делает для чистого API.
РЕДАКТИРОВАТЬ 2: Пожалуйста, игнорируйте проблемы в примере кода, я написал его inline в текстовом поле SO, чтобы сделать мой вопрос понятным с каким-то примером. Очевидно, это не настоящий код!:)