gpt4 book ai didi

java - 在没有新对象实例的情况下使用 try-with-resources 是错误的形式吗?

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:45 26 4
gpt4 key购买 nike

一般来说,我总是看到 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...

这被认为是错误的形式吗?

编辑:我想我是在问是否有更好的替代方法来构建这种逻辑,或者在使用上述方法时是否存在一些主要缺点。我发现在库中使用它可以得到一个干净的 API。

编辑 2:请忽略代码示例中的问题,我将其内联写入 SO 文本框中,以通过某种示例阐明我的问题。显然这不是真正的代码! :)

最佳答案

try-with-resource 语法旨在作为一种语法糖,使您能够确保处置对象,无论处置逻辑是什么。在您的情况下,它将对象返回到池中。像这样使用 try-with-resource 绝对没有错。它可能不是最常见的用例,但绝对是一个有效的用例。

关于java - 在没有新对象实例的情况下使用 try-with-resources 是错误的形式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38656695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com