2012-07-03 13 views
8

インナークラス内の変数を変更する必要があり、「違うメソッドで定義されたインナークラス内の最終変数を参照できません」というエラーが発生しました。インナークラス非最終変数java

void onStart(){ 
    bt.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     int q = i; 
    } 
    }); 
} 

私はすぐに私が変更したいすべてのものを保有するクラスを作り、内部クラスの外のクラスの最終版を作っ

class temp{ 
    int q; 
} 

void onStart(){ 
    final temp x = new temp(); 
    bt.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     x.q = i; 
    } 
    }); 
} 

これは私が必要なもののようですし、それ私はこれが正しく問題を回避する方法であるかどうか疑問に思っています。また、私のクラスに名前をつけるのにtempという言葉を使うのは本当に嫌です。私のクラスのためのよりわかりやすい名前を作るために私がしたことのための実際のプログラミングの用語はありますか?

答えて

9

(現在行っているように)匿名のクラスではなく、単純に内部クラスを作成できます。次に、メンバーを設定するコンストラクタやその他のメソッドがあります。ハッキーさは必要ありません(1件の配列のように)。

クラスで外部クラスとのデータ交換が必要な場合はこのクリーナーが見つかりますが、それは個人的な好みであると認めます。 1イディオムの配列も同様に動作し、より簡潔ですが、率直に言って、それはちょうど醜いように見えます。私は通常、匿名の内部クラスを、外部クラスのデータを更新しようとせずにアクションを実行するクラスに限定します。例えば

private MyListener listener = new MyListener(); 

void onStart(){ 
    bt.setOnClickListener(listener); 
} 

class MyListener implements OnClickListener 
{ 
    String name; 
    int value; 

    void setName(String newName) 
    { 
     name = newName; 
    } 

    void setValue(int newValue) 
    { 
     value = newValue; 
    } 

    public void onClick(View v) 
    { 
     // Use the data for some unknown purpose 
    } 
} 

関与する複数のスレッドが存在する場合、適切な同期が同様に使用されなければなりません。

+0

ブラボー。もう一つの良い点は、この内部クラスがより拡張性と再利用可能であることです。 IMO、匿名の内部クラスはほとんど常に悪い考えです。 – user949300

+0

アクションスタイルクラス、つまり入力に基づいてアクションを実行できる特定のイベントのハンドラとして機能します。彼の例であるGUIプログラミングでは非常に一般的です。この場合を除いて、問題を複雑にするクラス間の相互作用があります。 – Robin

+0

これは私が探していたものです!ありがとう! –

2

私はother thread hereに同様の回答を掲載しました。基本的には、Objectタイプのものすべてをラップする「ラッパー」を作成することです。 Javaのfinalは「再割り当てなし」を意味し、「一定」ではないため、このトリックはかなりうまく動作します。しかし、元の投稿に記載されているように、マルチスレッド環境で使用する場合は注意してください。

0

私は外部クラスのクリックリスナーへの参照を保持し、intをリスナーのメンバー変数にします。変数をクリック時にリスナーに格納してから、必要なときに外側のクラスの変数をクリックのポイントに設定するのではなく、取り込みます。

簡単に言えば、内部クラスを変更する必要がある場合は、内部クラスの変数にします。

0

複数のものを設定しているように見えるので(コメントから)、メインクラスのメソッドbutton1WasClicked()(doUpdate、doSaveなどのより良い名前 - ボタンの機能に関連するもの)を作成します。put適切なコードを内部クラス/リスナーから呼び出します。 (スイングを使用している場合は、YMMVをアクションにします)

あとで同じものを実行する必要があるメニューやインテントまたはジェスチャーがある場合は、コールがそこにあります。

関連する問題