Javaの内部クラスから外部クラスのthisを参照する

前置き

タイトル通りです。「外部クラスのthis」という表現は不正確かもしれません。厳密に言うなら「その内部クラスオブジェクトに関連付けられた外部クラスオブジェクト」でしょうか。

本文

Androidを例に説明します。まず、内部クラスを使わないシンプルなコードを見て下さい。

public class Outer implements DialogInterface.OnClickListener {
    private Button mButton;

    public Outer(Button button) {
        mButton = button;
    }

    public void doIt() {
        mButton.setOnClickListener(this);
    }

    public void onClick(DialogInterface dialog, int which) {
    }
};

ここで、doIt()のリスナ登録処理を非同期に変えたいとしましょう(理由は聞かないで下さい)。Runnableを継承した無名インナークラスを使います。

    public void doIt() {
        Handler h = new Handler();
        h.post(new Runnable(){
            public void run() {
                mButton.setOnClickListener(this);
            }});
    }

これはコンパイルエラーになります。run()の中では、thisが内部クラスオブジェクトを指します。一方、setOnClickListener()の引数には、DialogInterface.OnClickListenerをimplementsしたクラスのオブジェクトを指定する必要があります。

つまり、内部クラスのメソッド内から「外部クラスのthis」を参照したいわけです。これには、「外部クラス名 + .this」と表記すればOKです。

    public void doIt() {
        Handler h = new Handler();
        h.post(new Runnable(){
            public void run() {
                mButton.setOnClickListener(Outer.this);
            }});
    }
Last modified:2011/03/30 12:17:42
Keyword(s):
References:[言語Tips]
This page is frozen.