2
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 变量声明为类变量吗?我尽量避免这样声明,因为它只在那个函数中使用。

请告诉我是否有更好的方法来解决这个问题。

4

3 回答 3

12

而不是使用:

final Class_A obj = null;

你应该可以使用

final Class_A obj;

这将允许您obj在 if 语句中进行初始化 - 有关更多信息,请查看来自 Wikipedia 的空白决赛的描述,这是我们所有人都信任的来源。

于 2012-11-28T04:02:48.117 回答
2

你可以做

final Class_A obj = a ? new Class_A("a") : new Class_A("B");

但是,我不知道是否有办法在更复杂的条件下做到这一点。

于 2012-11-28T04:02:19.400 回答
2

结合 tbd 和 Xymotech 的答案 + 我的另一个信息,您可以执行以下操作。

1)在您的代码中,您声明了这样的最终变量final Class_A obj = null;

一旦您将最终变量分配给某个值,您就不能再替换或重新分配它的值。有关这方面的更多信息,请参阅此处此处

话虽如此,您不允许这样做

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;

于 2012-11-28T06:50:54.113 回答