我的类 Foo
有两种构造方式:
public Foo(Bar bar)
public Foo(Baz baz)
有可能从 Bar
中获取 Baz
并尝试使用 resources idiom like
try (Baz baz = bar.expensiveFunction()){
// code here
}
我想做的是在Foo(Bar bar)
构造函数中,本质上写
public Foo(Bar bar)
{
try (Baz baz = bar.expensiveFunction()){
this(baz);
}
}
但这是不允许的,因为 this(b)
不在第一行。有谁知道我如何在 Java 中实现这一点?当然,我可以使用 initialise
函数,但我不想那样做。
最佳答案
@Bathsheba 的方法更好。但我认为有一种方法只适用于构造函数……在某些情况下。
如果Foo
类扩展 Object
,你可以这样做:
public Foo(Bar bar) {
this(bar.expensiveFunction(), true);
}
public Foo(Baz baz) {
this(baz, false);
}
private Foo(Baz baz, boolean close) {
super();
try {
// initialize
} finally {
if (close) {
baz.close();
}
}
}
如果new Foo(someBar)
在 Foo
的初始分配中抛出 OOME对象,它将在调用 expensiveFunction()
之前发生发生,所以不会有Baz
将被关闭。
但是如果Foo
扩展其他一些类,然后是 super()
来电Foo(Baz, boolean)
可能 抛出异常...不能在Foo
中捕获.如果你不能捕获异常,那么你就不能关闭 Baz
.
关于java - 在另一个构造函数中使用带有 try-with-resources 习惯用法的委托(delegate)构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49975518/