gpt4 book ai didi

java - 如何在 Java 中组合 Closeable 对象?

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

我正在尝试创建一个管理多个 Closeable 资源的 Java 类。 C++ 解决方案简单明了,并且可以轻松扩展到更多资源:

class composed_resource
{
resource_a a;
resource_b b;
resource_c c;

composed_resource(int x)
: a(x), b(x), c(x)
{ }

~composed_resource()
{ }
};

我天真的 Java 解决方案:

public class ComposedResource implements Closeable
{
private final ResourceA a;
private final ResourceB b;
private final ResourceC c;

public ComposedResource(int x) /* throws ... */ {
a = new ResourceA(x);
try {
b = new ResourceB(x);
try {
c = new ResourceC(x);
} catch (Throwable t) {
b.close();
throw t;
}
} catch (Throwable t) {
a.close();
throw t;
}
}

@Override
public void close() throws IOException {
try {
a.close();
} finally {
try {
b.close();
} finally {
c.close();
}
}
}
}

稍微改进的版本:

public class ComposedResource2 implements Closeable
{
private final ResourceA a;
private final ResourceB b;
private final ResourceC c;

public ComposedResource2(int x) /* throws ... */ {
try {
a = new ResourceA(x);
b = new ResourceB(x);
c = new ResourceC(x);
} catch (Throwable t) {
close();
throw t;
}
}

@Override
public void close() throws IOException {
try {
if (a != null) a.close();
} finally {
try {
if (b != null) b.close();
} finally {
if (c != null) c.close();
}
}
}
}

是否有更优雅的解决方案来避免嵌套的 try-catch-blocks,同时仍然保持异常安全?它可以通过三种资源进行管理,但再多就变得笨拙了。 (如果是本地范围,我可以只使用“try-with-resources”语句,但这在这里不适用。)


我在使用 java.rmi 时考虑过这个问题。在构造函数中,我正在创建/查找注册表、查找对象和导出对象。 close() 需要注销和取消导出对象。我考虑过创建包装器对象来处理导出/取消导出(就像我在 C++ 中做的那样以利用 RAII),但后来我发现这对我帮助不大(我不是 Java 专家,但我必须将它用于大学)。

目前我正在使用类似上面的 ComposedResource2 的东西,它工作正常。但现在我很想知道是否有更优雅的解决方案。

最佳答案

像这样使用 try-with-resources。

@Override
public void close() throws IOException {
try (Closeable cc = c;
Closeable bb = b;
Closeable aa = a;) {
// do nothing
}
}

关于java - 如何在 Java 中组合 Closeable 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34283684/

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