- PR -

見たことのない書き方

投稿者投稿内容
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2005-01-07 14:30
お世話になります。

下記ロジックの8行目が理解できません。
見た感じだと、SampleクラスのなかでDataクラスを新たに?作成しているのかなぁと
思うのですが。今までこんな書き方を見たことがないもので…。

どなたかご教授お願い致します。

class Data{
String[] strs = {"Hello","Bye"};
void show(){System.out.println(strs[0] + ":" + strs[1]);
}
}
class Sample{
public static void main(String args[]){
Data d = new Data(){void show(){System.out.println("XXX");}};
d.show();
}
}

結果:XXX
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-01-07 14:35
Swingプログラミングなんかをしてると Adapter を利用する場合にこんな書き方しますね。

この場所だけで匿名で継承して挙動を変えているわけですね。
継承して挙動を変えたいけれども、特に他で再利用するわけではない、って場合に使います。
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2005-01-07 14:49
こういうことでしょうか…

class Data{
String[] strs = {"Hello","Bye"};
void show(){System.out.println(strs[0] + ":" + strs[1]);
}
}
class DataXXX extends Data{
void show(){System.out.println("XXX");}
}
class Sample{
public static void main(String args[]){
DataXXX d = new DataXXX();
d.show();
}
}

※DataXXXのshowは、Sampleのmainでしか使われない
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-01-07 15:05
どもでし。がると申します。
ちっと面白げなネタだったのでしゃしゃり出てまいりました(笑

さって。
通常、オブジェクトを作る際に使われる
クラス名 変数 = new クラス名;
という宣言ですが。
これをもうちょっと厳密に書くと、

クラス型をあらわすクラス名 オブジェクトを格納する変数
 = new 事前にどーゆー内容か宣言されているであろうクラスのクラス名

となります。
で、該当のコードの場合
「事前に宣言しないで使うときにその場で宣言している」やり方、
になります。
…昔、Cのstructでこーゆーソースをたまに見てたような気がしますが。

んで、インギさんのおっしゃる通り「継承して挙動を変えたいけれども、
特に他で再利用するわけではない」ケースで使うのですが。
個人的には"悪い意味で"職人芸っぽいソースかなぁ、とか感じてみたり。

まぁ、世間を渡ってるといろんなソースがあるってことで :-P
すめし
会議室デビュー日: 2005/01/04
投稿数: 10
投稿日時: 2005-01-07 15:52
こういう書き方って「無名インナークラス」っていいます...よね?

ちなみに、がるがんさんと同じく思ってます>個人的に...悪い意味で...
YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2005-01-07 17:49
私も、基本的には可読性が低い等の理由で使いませんが、例外的に
JUnitテストケースで、テスト対象(及びその依存クラス)の挙動を変えたいときには頻繁に使います。。。
あとはインギさんもおっしゃっているSwing等のイベントハンドラですかね。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2005-01-07 21:04
私も、最初は嫌いで避けてました。

でも、ここ4〜5年は普通に使ってます。結構イイかも。
Cyclomaticな複雑性がすぐに範囲外になってしまいますが…。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-01-07 21:56
基本的な振る舞いは同じだけど、細かい部分で違うクラスをいろいろ作りたい場合に
Template Methodパターンと組み合わせてよく使います。

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