void function_ab(){
if ( a == true){
final Class_A obj = new Class_A("a"); //This is an example scenario, so I couldn't create a setter to pass in "a" instead of passing it into Contructor.
}else{
final Class_A obj = new Class_A("B");
}
// the code below will access obj object in Inner class.
}
我需要在声明后访问obj,但由于它们是在'if'块中声明的,因此我将无法访问它。我也做不到这样的事情:
void function_ab(){
final Class_A obj = null;
if ( a == true){
obj = new Class_A("a"); //final variable cannot be changed.
}else{
obj = new Class_A("B");
}
// the code below will access obj object in Inner class.
}
上述代码无效。那么让它工作的唯一方法是将obj变量声明为类变量吗?我尽量避免这样声明,因为它只在那个函数中使用。
请告诉我是否有更好的解决方法。
答案 0 :(得分:12)
而不是使用:
final Class_A obj = null;
你应该可以使用
final Class_A obj;
这将允许您在if语句中初始化obj
- 有关更多信息,请查看来自维基百科的blank finals的描述,这是我们可能信赖的来源。
答案 1 :(得分:2)
你可以做到
final Class_A obj = a ? new Class_A("a") : new Class_A("B");
但是,我不知道在更复杂的条件下是否有办法做到这一点。
答案 2 :(得分:2)
结合tbd和Xymostech的答案以及我的其他信息,您可以执行以下操作。
1)在您的代码中,您声明了最终变量,如final Class_A obj = null;
将最终变量分配给某个值后,您将无法再替换或重新分配该值。有关详情,请参阅here和here
据说你不允许这样做
if ( a == true){
final Class_A obj = new Class_A("a");
}else{
final Class_A obj = new Class_A("B");
}
2)如果你要使用其他一些值或一个简单的计算来确定一个布尔值你可以这样做
final Class_A obj = a ? new Class_A("a") : new Class_A("B");
从你的代码判断,你可以做我给你的两个选择。
但是从你的代码中你可以做到这一点。
void function_ab(){
final Class_A obj;
if ( a == true){
obj = new Class_A("a"); //final variable cannot be changed.
}else{
obj = new Class_A("B");
}
// the code below will access obj object in Inner class.
}
只需删除final Class_A obj;