- PR -

メソッドの中にメソッド?

1
投稿者投稿内容
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-11-11 01:29
いつもお世話になります。J2SDK 1.4.2_06です。
ThredLocalクラスを使おうとドキュメントを見ていたら、サンプルで
今まで見たことの無い記述方法が出てきて少々戸惑っております。

public class SerialNum {
// The next serial number to be assigned
private static int nextSerialNum = 0;

private static ThreadLocal serialNum = new ThreadLocal() {
protected synchronized Object initialValue() {
return new Integer(nextSerialNum++);
}
};

public static int get() {
return ((Integer) (serialNum.get())).intValue();
}
}

クラス変数宣言のすぐ下のThreadLocalを返すメソッド(あれ?変数?)
内にブロックでくくられてさらにメソッドが入ってます。
今まで基礎っぽいことしかやってなかったのでこのような記述を
見たことがなかったのですが、メソッドをネストしてるんでしょうか?
記述方法の呼び方さえも分かりませんので調べようが無いのです。
参考になるサイト等ご存知の方、是非紹介していただきたいです。
よろしくお願いします。 
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-11 01:59
これは匿名インナークラスと呼ばれる表記法です。

特定のクラスを拡張したいけれども他で利用する場面がないのでイチイチ新しいクラスを書き起こすのは面倒だし、メソッド一つ実装するだけに別のブロックや java ファイルに書いては可読性が下がってしまう、というような場合に利用します。
意味的には以下のコードとだいたい一緒です。
#コンパイルできるか、動作などは未検証です
コード:

private static ThreadLocal serialNum = new MyThreadLocal();

class MyThreadLocal extends ThreadLocal() {
protected synchronized Object initialValue() {
return new Integer(nextSerialNum++);
}
};



[ メッセージ編集済み 編集者: インギ 編集日時 2005-11-11 02:01 ]
take
大ベテラン
会議室デビュー日: 2004/08/13
投稿数: 177
お住まい・勤務地: 沖縄県北部
投稿日時: 2005-11-11 02:28
インギさん、ご返答ありがとうございます。
JAVAをはじめるときに最初に買った入門書でswingの
練習用アプリを作りました。その時にも出てきたやつです。
今思い出しました。WEBアプリばっかりやってるとあまりお目に
かかれないのでしょうか、完全に忘れてました。
匿名内部クラスって書いてありました。日本語名ですね?
入門書ではとりあえずこんな感じで書けばいいんだよ的な
書かれ方をしてたので、それがextendsを含む意味だと言うこと
は知りませんでした。勉強になりました。ありがとうございました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-11 07:50
そうそう、Swing とかで Adapter を使うときにも大抵メソッド一つしかオーバーライドしないのでよく使いますね。
英語では anonymous inner class ですね。
http://www.google.com/search?client=safari&rls=ja-jp&q=anonymous+inner+class&ie=UTF-8&oe=UTF-8
1

スキルアップ/キャリアアップ(JOB@IT)