一般來說,我一直看到的try-與資源用於分配新對象實例其close()
方法被調用,因爲它超出的範圍外。正在使用try-with-resources而沒有新的對象實例壞形式?
據我所知,創建一個新對象不是必需的,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...
這被認爲是不好的形式?
編輯:我想我問是否有更好的替代方案來構建這種邏輯,或者如果使用上述方法時有一些主要缺點。我發現在庫中使用它可以創建一個乾淨的API。
編輯2:請忽略代碼示例中的問題,我在SO文本框中將其內聯編寫,以便使我的問題在某些示例中得到明確。顯然這不是真正的代碼! :)
這很好 - 這也是它在使用連接池時的一般做法:'try(Connection c = pool_or_datasource.getConnection()){}'... – assylias