java - 在另一个构造函数中使用带有 try-with-resources 习惯用法的委托(delegate)构造函数

标签 java

我的类 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/

相关文章:

java - 在建立数据源连接之前获取 URL 值

java - 支柱2 : Incorrect/misspelled getter and setter name of a field

java - Java 数组中每个元素有多个值

java - JSF 2.0 如何从资源文件夹链接 CSS

java - 如何使用 Objectify 更新数据存储实体?

java - 在执行者提交()之后,Future 是否立即为 isDone()返回 false

java - 将字符串转换为字节 - Java

Java枚举构造函数错误

java - Selenium WebDriver-如何控制运行测试用例的速度

java - 需要帮助弄清楚为什么我的 TestClock.java 程序上出现 java.lang.StackOverflowError