Java tips 無名クラスにパラメータを渡すサンプルです。

解説

無名クラスには通常外部から自由にパラメータを渡すことが出来ないため、いつも無名クラスのためにメンバ変数を用意していました。
でもJavaには無名クラスにパラメータを渡す方法があったのでメモして置きます。

ポイント

  • パラメータを保存する変数を用意する
  • パラメータを受け取るメソッドを作成する
  • パラメータを受け取るメソッドは自分自身を戻り値とする
  • 無名クラスを作成した瞬間だけ、パラメータ受け渡し用のメソッドを実行出来る

ローカル変数にfinalつけて、無名クラスの中からアクセスできるようにも出来るらしいです…

実行結果


無名クラスにに渡したパラメータでダイアログを表示してみました。

ソースコード NoNameParam.java

import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
 
class NoNameParam extends JFrame {
	NoNameParam() {
		init();
		addMessageButton("メッセージ", "ほげほげっ");
		addMessageButton("メッセージ2", "もげもげ");
	}
 
	public void init() {
		getContentPane().setLayout(new FlowLayout());
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setTitle("無名クラスにパラメータを渡す");
		setSize(200, 300);
		setVisible(true);
	}
 
	private void addMessageButton(String btnName, String msg) {
		JButton btn = new JButton(btnName);
		ActionListener al = new ActionListener() {
			// ポイント1 パラメータを格納する変数
			Component parentComponent;
			String msg;
 
			// ポイント2 無名クラスにパラメータを渡すメソッド 無名クラス自身のクラスを返却する
			ActionListener setParam(Component parentComponent, String msg) {
				// パラメータ格納
				this.parentComponent = parentComponent;
				this.msg = msg;
				// ポイント3 自分自身を返却する
				return this;
			}
 
			@Override
			public void actionPerformed(ActionEvent e) {
				JOptionPane.showMessageDialog(parentComponent, msg);
			}
			// ポイント4 無名クラスを作成した瞬間だけ、setParamを呼べる。
		}.setParam(this, msg);
 
		btn.addActionListener(al);
		getContentPane().add(btn);
	}
 
	public static void main(String[] args) {
		new NoNameParam();
	}
}