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

时间:2016-03-27 14:18:40

标签: java try-with-resources

我想使用try-with-resources语句将接口对象定义为具体类。下面是一些松散定义我的界面和类的示例代码。

interface IFoo extends AutoCloseable
{
    ...
}

class Bar1 implements IFoo
{
    ...
}

class Bar2 implements IFoo
{
    ...
}

class Bar3 implements IFoo
{
    ...
}

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

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

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

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的问题: How to use Try-with-resources with if statement?但是,在那里给出的解决方案将需要嵌套的三元语句用于我的场景,并且实际上很快就会变得混乱。

有谁知道这个问题的优雅解决方案?

2 个答案:

答案 0 :(得分:4)

定义工厂方法以创建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
  }
}

答案 1 :(得分:1)

我同意最好的解决方案是编写一个帮助方法,如this回答。

但是,我还想指出嵌套的三元运算符凌乱。您根本不需要括号,并且格式良好可以使其看起来像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
}