我想使用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?但是,在那里给出的解决方案将需要嵌套的三元语句用于我的场景,并且实际上很快就会变得混乱。
有谁知道这个问题的优雅解决方案?
答案 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
}