2011-02-03 6 views
1

これまでのところ、私は内部クラスの範囲からthisにアクセスするには、このアプローチを使用しました:内部クラスの内部で使用するために 'this'を明示的に参照した場合はどうなりますか?

:代わりに referenceToThisを宣言する、直接参照は次のように私のために保持され

class FooManagementWindow extends JFrame { 
    JButton rejectFoo; 
    //... 
    void getFooAcceptingPanel(){ 
    //... 
    final FooManagementWindow referenceToThis = this; 
    rejectFoo = new JButton("Reject"); 
    rejectFoo.addEventListener(new EventListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg) { 
     referenceToThis.setEnabled(false); //this requires a network call 
     //... 
     referenceToThis.setEnabled(true); //the user may resume his work 
     } 
    });     
    //... 
    } 
} 

しかし、私はちょうどlearned

FooManagementWindow.this 

私の標準的ではないアプローチがエラーや奇妙なコーナーケースにつながるとは考えにくいです。それとも?

+0

いいえ、私は戻って、すべてのインスタンスを修正する時間がありません。 – badp

+2

He-he、それは私がClassNameについて見つけられるまで私が使っていたものです。このようなもの:) – Bogdan

答えて

1

リスナーを1つの参照で大きくする点を除いて、問題はありません。何千もの人がいなければ問題ありません。

実際には、FooManagementWindow.thisも囲んでいるインスタンスからも何も使用しないと、理論的には使用されていない参照が排除され、あなたのアプローチは無料になります。私はそれが許可されている場合、私はそれがそれを行うかどうかは分かりません。デバッガはそうしないと言います。

2

あなたがそれをやっている方法(「非標準」でないことに加えて)に「間違った」ものは何もありません。これは基本的に、Javaコンパイラがあなたのためにバックグラウンドで行うのと同じことです。

1

あなたを別の方向に向けるだけです。あなたはいつも、これを変更することができます:

rejectFoo.addEventListener(new EventListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg) { 
     referenceToThis.setEnabled(false); //this requires a network call 
     //... 
     referenceToThis.setEnabled(true); //the user may resume his work 
     } 
    });   

これに:

rejectFoo.addEventListener(new EventListener() { 

     @Override 
     public void actionPerformed(ActionEvent arg) { 
     rejectFooActionPerformed(arg); 
     } 
    });   

// ... after the getFooAcceptingPanel() method 

public void rejectFooActionPerformed(ActionEvent arg) { 
    setEnabled(false); //this requires a network call 
    //... 
    setEnabled(true); //the user may resume his work 
} 

あなたはこの方法であなたのアクションコードのすべてを書くときに、あなたの内部クラスからthis.methodを呼び出すとことができるので、これは動作しますあなたはクラスのスコープ内にあり、内部クラスではありませんので、あなたが言うことをする必要はありません。

ちょっと食べただけの食べ物ですが、私はいつもこの方法を少し洗っています。すべてのコードを匿名の内部クラスに入れることは面倒であり、良い方法ではありません。

+0

実際、私が以前の小さなプロジェクトで試したことは、公的なものの外にたくさんのプライベートクラスを作り、いずれにしても、Javaをサポートすることで、関数をオブジェクトにカプセル化せずに直接渡すことができます。 – badp

+0

Java 7がリリースされれば、あなたの希望は実現するかもしれません! http://wiki.java.net/bin/view/JDK/ClosuresSyntaxInJava7編集:オラクルは2011年7月28日のリリース日を発表しました。 – jluzwick

関連する問題