2012-03-25 6 views
2

ユーザーが編集できるテキストボックスを持つプログラムがあります。ユーザーがボタンを押すと、ダイアログボックスが作成され、ユーザーのテキストが表示され、「はい/いいえ」オプションが確認されます。OnClickListenerのJava最終的な変数の必要条件

public void setIP(View v){ 
    //get the text inside the editor 
    EditText et = (EditText) findViewById(R.id.editTextIP); 
    final String IP = et.getText().toString(); 

    //create dialog 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("Set I.P. to : " + IP + " ?") 
      .setCancelable(false) 
      .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        host = IP; 
       } 
      }) 
      .setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        dialog.cancel(); 
       } 
      }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
} 

このコードは正常に動作しますが、私の最初のバージョンはコンパイルされません。私のIDEは、文字列をIPfinalにしなければならないと訴えました。

これは私に考えさせました。この場合、finalは何を追加しますか?たとえば、ダイアログへの参照を保持し、別の方法で表示することを選択した場合はどうなりますか?つまり、上記のメソッドが返されます。では、変数IPはどうやってくれるのでしょうか?

最終的なキーワードは、値が変更されていないことを保証するだけで、onClickListenerにはIPの値を格納させることができます。 IPのスコープは増加していますか?

+3

参照してください:[別の方法で定義された内部クラス内の最終的でない変数を参照できません](http://stackoverflow.com/questions/1299837/cannot-refer-to-a-non-final-内部変数で内部変数を定義する) –

+0

可能な複製[EventHandlerがオブジェクトを最終的に要求する時期と理由](http://stackoverflow.com/questions/2809131/when -and-why-does-an-eventhandler-require-objects-to-be-final) – SoapBox

答えて

3

最後のキーワードは、値が0123,の値を格納できるように、他の場所では変更されないことを保証しますか? IPのスコープは増加していますか?ある意味では

、はい(これは本当に「エクステント」ではなく「スコープ」ですが、「スコープは」まだの終わりにIP}の宣言の間だけのプログラムテキストです関数)。

本質的には、new DialogInterface.OnClickListener() { ... }に暗黙のフィールドIPがあり、オブジェクトの構築時に自動的に初期化されます。 final修飾子は、ローカル変数IPと暗黙的フィールドIPが引き続き同じStringインスタンスを参照するようにすることで、単一のIP変数の抽象化を保護します。

+0

次にプリミティブ型はどうですか?なぜ彼らは最終的にする必要がありますか? – Untitled

+0

@SahandMozaffari私はruakhの説明がプリミティブにも同様に当てはまると思います。 – emory

+0

@SahandMozaffari:まったく同じことです。最後のビットを "ローカル変数' IP'と暗黙的フィールド 'IP'が同じ値を持ち続けることを保証することによって"に変更してください。 – ruakh

関連する問題