1

次のコードでは、最初のifステートメントはそれcurrent_guyができないと文句を言いますfinalが、2番目のifステートメントはそれcurrent_guyが最終ではないと文句を言います。私は考えが足りません。

final int current_guy=0;

if (a.equals("bf")){
   current_guy=1;
}

guy1.setOnClickListener(new OnClickListener() {    
   public void onClick(View v) {

   if (current_guy==1) {
      // TODO Auto-generated method stub
   }
}
4

7 に答える 7

8
final int current_guy = a.equals("bf") ? 1 : 0;
于 2012-10-01T19:09:45.263 に答える
3

ジョーダン・デニソンは、削除された回答でこれを持っていました..正しいので、理由はわかりません。これは、現在の回答の「完全性」のための単なる再投稿です。(そうは言っても、ここでは三項演算子のアプローチを使用する可能性が高いです。)

final変数の割り当ては、使用前にすべてのコード パスで正確に 1 回割り当てられている限り、遅延する可能性があることに注意してください。

final int current_guy; // no assignment here

if (a.equals("bf"))
    {
        current_guy=1;
    }
else
    {
        current_guy=0;
    }
于 2012-10-01T19:13:41.093 に答える
2

current_guy を別の最終変数に割り当てることができます

final int finalCurrentGuy = current_guy;
guy1.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
       if (finalCurrentGuy==1) {
         ....
       }
    }

これにより、その時点で変数 current_guy のコピーが作成され、それが内部クラスに渡されます

この SO投稿は、内部クラス内で最終でなければならない理由を説明しています

于 2012-10-01T19:14:21.393 に答える
2

私がすることは:

int current_guy=0;

// Set the value that you want based on a condition
if (a.equals("bf"))
{
    current_guy=1;
}

final int valueToTest = current_guy;
guy1.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

if (valueToTest ==1) {
    // your code
    }
}

これが課される理由は、onClick()メソッドがイベントに応答してしばらくしてから実行され、別のスレッドにある可能性があるためです。次に、ハンドラの実行中に変数の値をそのハンドラの内部または外部のどこかで変更する必要はありません。値のダーティーリードを防ぐためだと言えます。

于 2012-10-01T19:19:59.210 に答える
1

最初のものが不平を言っている理由は、最終変数を設定できないためです。それが最終版ではないと不平を言っているのは、匿名内部クラスと呼ばれるものを作成しているからです。したがって、OnClickListener は完全に別のクラスであり、実行時にメイン クラスから変数にアクセスすることはできません。これが、Final でなければならない理由です。次に、コンパイラがアプリをビルドするときに、その値が何であるかを認識し、そこで置き換えることができます。この変数を変数にしたい場合は、値を OnClickListener に渡して、変数の変更に応じて更新を取得できるようにする必要があります。

于 2012-10-01T19:11:53.857 に答える
0

あなたを実装する別のクラスを作成し、それをパラメーターとしてOnClickListener渡します。current_guyこれにより、変数が最終的ではないという不平を言うのを防ぎます。そのような内部クラスとメソッドを宣言する場合、非最終変数を参照することはできません。

于 2012-10-01T19:07:36.393 に答える
-2

チェック/調整したらcurrent_guy、最終変数に割り当てます。

int current_guy=0;


if (a.equals("bf"))
    {
        current_guy=1;
    }

final int final_current_guy = current_guy;

guy1.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {

    // TODO Auto-generated method stub
    if (final_current_guy==1) {
        }
    }

または、1 行の割り当てを使用します。

final int current_guy = (a.equals("bf") ? 1 : 0);
于 2012-10-01T19:09:38.360 に答える