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;

これにより、ifステートメント内で初期化できるようになります。詳細については、ウィキペディアの空白の決勝戦objの説明を確認してください。これは、私たち全員が私たちの生活に信頼できる情報源です。

于 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とXymostechの答えと私からの別の情報を組み合わせると、次のことができます。

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.

}

のnull割り当てを削除するだけです final Class_A obj;

于 2012-11-28T06:50:54.113 に答える