Hatena::ブログ(Diary)

taguiの日々の妄想 このページをアンテナに追加 RSSフィード

2008-01-18 無名インナークラスって使ってます? このエントリーを含むブックマーク このエントリーのブックマークコメント

ハカーな人達に質問ですけど(○○○はかーあたりに期待ですよ)
Javaの無名インナークラスって、
GUI系だとかで何かしらコールバック的な処理させるときは使うこと多いですよね。
他だと終了時にリソース開放させるためのシャットダウンフック実装するときに、
Threadでつかったり。これもコールバックな感じかな?
あと、DBのトランザクション関連とか?

普段頻繁に使います?

下のサンプルみたいな感じのを実際に昔書いたりしましたが。。

使う理由って
・ちょっとしたことなんだから、クラス名つけてホゲホゲってめんどくさい。
・どうせ一箇所でしか使わないからね。
・実際の処理をするコードが固まってるので、後から他の人が見るときに
  あちこち見なくていいからいいんじゃない?

あたりが思いつくんですが、他に積極的に使う理由ってあります?

public class Hoge  {
	// Printインターフェイス
	static interface PrintInterface {
    	public void print();
	}

	// プリント実行用のExecutor
	static class MyExecutor {
		public void execute( PrintInterface com) {
    		com.print();
    	}
    }

	public static void main(String[] args) {
		// Executorにコマンド渡して実行。
		new MyExecutor().execute(
			// 無名インナークラスでインターフェイスをimplementsしたクラスをつくるか
			new PrintInterface() {
				public void print() {
				  System.out.println("hogehoge");
				}
			}
		);	
	}
}

cepoccepoc 2008/01/18 20:21 ほら、ひとの無知を暴くような無茶振りしないの!
正直マトモに書いた事があるのはEclipseプラグインだけであるのはご承知の通り。
そんな訳で、フレームワーク側に促されるがまま、リスナ定義に匿名クラスを使うケースがほとんどですね。

そんな感じで、あとはこちらのエントリにフォローして頂くことにする。
http://www.eisbahn.jp/yoichiro/2006/05/post_87.html

そうそう。最近「お、なるほど」と思ったのは、Visitorパターンでの匿名クラス。Doltengで見かけた。
興味があれば org.seasar.dolteng.projects.ProjectBuildConfigResolver こちら。

tagui99tagui99 2008/01/18 20:33 おっ さすが!
ありがたい言葉を頂きました。
イベント駆動なプログラムする時に使うよね?
Wicketも?とか
ってことで、張られてるリンク見てみるねー。

t_yanot_yano 2008/01/19 06:28 私はサーバーサイドでもわりと無名内部クラスは使いますよ。主に、例に出ていたトランザクション絡みの所で。内部クラスとしてロジックを渡すと、そのロジックをトランザクション内で実行、という感じですかね。

Swingだと、使いまくりです。

無名クラスを使う理由というと感覚的なものですけど、
「ちょっとしたことなんだから、クラス名つけてホゲホゲってめんどくさい。」←これはちょっとちがう
「後から他の人が見るときに あちこち見なくていいからいいんじゃない?」←これがかなり大きい

内部クラスの中のロジックも含めて一連の処理、という感じで使うので、その内部クラスだけ別の所に定義されると、コードが分かりにくくなるから。

無名クラスにはクロージャにもない味があるとおもうけどなあ。

tagui99tagui99 2008/01/19 13:03 >t_yano
世界の矢野さんからコメントが!

コマンド的な感じで実行する側に渡して、それをトランザクション内で実行するってのは、
それで一連の流れが把握できるんで、見たときに分かりやすいというのはありますね。

直感的に何をしてるかが、コードを見てすぐ分かるってのは非常に大事なんで、
納得いく理由ですね。

複数人に後からきいたら、
「後から他の人が見るときに あちこち見なくていいからいいんじゃない?」
ってのが理由?ときくとそれそれと答えがかえってきました。

daisuke-mdaisuke-m 2008/01/28 19:21 無意識に無名クラス使ったので報告w
たった今、Collections#sort()で、Comparatorを無名クラスで書きました。

tagui99tagui99 2008/02/11 18:18 ソートの比較方法を書くときに使うってのは確かにありだね。

Cだとqsortで関数ポインタ渡したりもするけど、その場で宣言ってのできないけど、
Javaの言語特性として、それができるってのポイントだね。