如何在 Java 中对接口对象使用 try-with-resources 语句

How to use try-with-resources statement with interface object in Java

我想使用 try-with-resources 语句将接口对象定义为具体 class。这是一些示例代码,松散地定义了我的界面和 classes.

interface IFoo extends AutoCloseable
{
    ...
}

class Bar1 implements IFoo
{
    ...
}

class Bar2 implements IFoo
{
    ...
}

class Bar3 implements IFoo
{
    ...
}

// More Bar classes.........

我现在需要定义一个 IFoo 对象,但是具体的 class 取决于我的代码的另一个变量。所有具体 classes 的逻辑都是相同的。所以我想使用try-with-resources语句来定义接口对象,但是我需要使用条件语句来查看我需要将接口对象定义为哪个具体class。

从逻辑上讲,这就是我想要做的:

public void doLogic(int x)
    try (
        IFoo obj;
        if (x > 0) { obj = new Bar1(); }
        else if (x == 0) { obj = new Bar2(); }
        else { obj = new Bar3(); }
    )
    {
        // Logic with obj
    }
}

我找到的与此相关的唯一资源是@Denis 的问题: 然而,那里给出的解决方案需要嵌套的三元语句用于我的场景,而且很快就会变得混乱。

有人知道这个问题的完美解决方案吗?

定义一个工厂方法来创建 IFoo 实例:

IFoo createInstance(int x) {
    if (x > 0) { return new Bar1(); }
    else if (x == 0) { return new Bar2(); }
    else { return new Bar3(); }
}

然后在您的 try-with-resources 初始化程序中调用它:

public void doLogic(int x) {
  try (IFoo ifoo = createInstance(x)) {
    // Logic with obj
  }
}

我同意最好的解决方案是像 回答中那样编写辅助方法。

不过,我还想指出,嵌套的三元运算符不会混乱。您根本不需要方括号,并且通过良好的格式可以使它看起来像 switch 语句:

try (IFoo foo = x > 20     ? new Bar1() :
                x < 0      ? new Bar2() :
                x == 10    ? new Bar3() :
                x % 2 == 0 ? new Bar4() : 
                             new Bar5()) {
        // do stuff
}