Niftyの過去ログ集 - inner class vs. delegate
inner class vs. delegate
Java のインナークラスと無名クラスを初めて見たときは,正直驚きました.インナーブロック(?)や無名ブロックだったら珍しくもなんともないですが,これをクラスにしてしまうとは・・.面白いとは思うのですが,実用面でどうなんだろう?という疑問もおこります.
01428/01428 BYI20012 まさーる inner-class vs. delagate ( 6) 98/06/30 00:14 まさーるです。 JavaWorldの今月号、VJ++のところを見てたらなんかSunとMicrosoftがJavaの言 語仕様でややこしい展開になってるんですね。 Sunは、inner-classでイベント処理などに対応してますが、Microsoft側は delegateという独自の言語拡張でイベント処理などに対応するようにしているら しいです。 delegateは、次のURLに解説がのってます: http://www.microsoft.com/visualj/techmat/feature/delegates/default.htm それに対するSunの反論が http://www.javasoft.com/docs/white/delegates.html で、そのまた反論が http://www.microsoft.com/visualj/techmat/feature/delegates/truth.htm です。 ざっと見ただけなんですが、delegateには、宣言、インスタンス化、呼び出しの 3つがあり、それぞれ ・delegateの宣言 delegate int Comparer(Object a, Object b); ・delegateのインスタンス化 Comparer c = new Comparer(this.stringCompare); ・delegateの呼び出し int comparisonValue = c.invoke(a,b); とするみたいです。上でthis.stringCompareはインスタンス化しているクラスの メソッドで、Comparerと同じシグニチャを持ちます。invokeという呼び出し名は 決まっているようです。Sunの記事ではDelphiがよく引き合いに出されてるんで すが似たような文法があるんですか?>詳しい方。 inner-class版だと ・interfaceの宣言 public interface Comparer { public int invoke(Object a, Object b); } ・inner-classのインスタンス化 Comparer c = new Comparer() { public int invoke(Object a, Object b) { return this.stringCompare(a,b); } }; ・intefaceからの呼び出し int comparisonValue = c.invoke(a,b); でしょうか(間違ってたらいってください)。 政治的な話はおいといて(^^;、こうしてみるとJavaのinner-classは他の言語には ないJava特有の機能なような気がしてきました。でも、やっぱりこっちの方がい ろいろ融通がききそうな気がしますね。Microsoftの方はシンプルですが。 あと、delegateのほうにはmulticastというキーワードがあってこれはメソッド リファレンスを複数登録しておいて、invokeメソッドで登録しておいたメソッド を一度に呼び出す機能らしいです。 98/06/30(火) まさーる(BYI20012)
今じゃ VJ++ なんて見向きもされなくなってますが(笑),VJ++ の開発者は,インナークラスや無名クラスみたいな特殊なものを導入したくなかったんでしょうね.delegate という独自拡張をしたくなるのもうなずけます.delegate は関数ポインタという従来の手法そのままですから.
01434/01434 BYI20012 まさーる RE^2:inner-class vs. delegate ( 6) 98/07/01 23:20 01429へのコメント TN さん、こんにちは。 >メソッドポインタはインスタンスへのポインタ+関数へのポインタという形の >構造体で,インスタンスごとに別々の関数として扱ったり,あるクラスのメソッド >を,既にあるインスタンスの窓口(イベントプロパティ)にアタッチして動作を >追加するという使い方をします. そうなんですか。 個人的にはinner-classの方が好きなんですけど、inner-class版だとinterface のほかにAdapterがあってやはり難しいです。 つまり、interfaceで public interface Listener { public void invokeA(); public void invokeB(); public void invokeC(); } とした場合、このうちの一つのメソッドがフックできればいいや、という状況が 多いものは、次のAdapter: public class Adapter implements Listener { public void invokeA() {} public void invokeB() {} public void invokeC() {} } という抽象クラスをライブラリから探してきて Listener listener = new Adapter() { public void invokeA() { this.doInvokeA(); } } とかするみたいです、Javaって。これだけでも使う人は混乱するんじゃないかな と。多重継承がないためにAdapterが用意されてるのでこの分クラスの数は増え ますし、delegateを作ってしまった人の気持ちもわからんではないです。 > VJ作った人=Delphi作った人だから(^^; うーん、やっぱ元Borlandの人だけあって言語拡張するのが好きですね。 98/06/30(火) まさーる(BYI20012)
その後あまり議論が発展するということもなかったですが,やはり,delegation 支持派と inner-class の方が好きという人に分かれました.
01447/01447 BYI20012 まさーる RE^3:inner-class vs. delagate ( 6) 98/07/04 23:27 01435へのコメント 小林 浩一 さん、こんにちは。 もうちょっと話が発展するかなって思ってたんですが、あまり興味のある人はい ないみたいですね。VJ++なんてJavaとは思っていない人も多いでしょうから、 「Sunは、なぜメソッドポインタを採用せず内部クラスや無名クラスを導入した か」 という質問のほうがよかったかもしれません。 >また,各種ListnerインタフェースのAdapterクラスを利用する >場合では,クラスの多重継承ができないため,複数のAdapterを利用 >するなら,やはり内部クラスを使うでしょう. そうですね。多重継承ができないから内部クラスなのか、そもそも内部クラスの 実装ほうが多重継承より優れているのか、ということも気になってます。今のと ころ内部クラスの利点は、前に僕が紹介したPrivate Intefaceが簡単に実装でき るんじゃないか、とか、クラスを階層的に構造化できるといいことあるんじゃな いか等、いろいろ考えてはいるんですが。 ># しかしGUI作るのが苦手な私は全然swingしていないので, ># 実情は知らないのであった.(^^; 最近Swingの本が出たんで読んでみたんですけど、この本だとListSelectとか ButtonClickとか、本来ならメソッド名に使うような名前をそのまま内部クラス 名にしてます。これを見たらなぜわざわざ内部クラスなのか疑問に思う人がいて も不思議ではないでしょう。 もっともこの本の著者は、オーバーロードとポリモルフィズムの違いがわかって なかったり、実装目的のみの継承をバンバン使ってたり、MVCモデルの説明をし ておきながらModelにTextFieldへのリファレンスを持たせたり、いろいろやって くれるので信用はできないんですけど。 まあ、これだけわかりやすい間違いをしてくれてるのですが、Swingをてっとり 早く勉強したい方にはおすすめです(ちょっと手元にないのでタイトルわすれち ゃいましたが、今Swingの和書はこれしか出てないはず)。 この本はおいといて、個人的にはSwingはかなり評価高いです。あれだけ柔軟性 と拡張性をもっているのに、使う側にはそんなに難しいことは要求していませ ん。コンポーネントの機能拡張にAttachmentパターン(Strategyパターンの拡張 版、ずっと前に僕が勝手に命名)を多用していたり、JListやJTreeの内部データ をModelで分離し、さながらミニMVCモデルとなっているところとか、結構気に入 ってます。まあ、少し触った程度で評価してしまうのもあれですが。 >Pure OOで考えるなら,メソッドも1階のオブジェクトでもいいのでは? 実は、この一階のオブジェクトとか二階のオブジェクトって何なのかよくわかっ てないんです。よく耳にはするんですが。 >で,その効果は? といえば,イベントのハンドリングはインタフェースを >ベースにするよりもずいぶんラクチンなように思われます. >必要に応じて,同じプロトタイプを持つメソッドを気の向くままに >書けばいいだけですから. > >ということで,個人的にはdelegateを支持したいなぁ. 僕は、将来性に期待して内部クラス・無名クラスですね。STLにおけるテンプレ ートと匹敵するくらいすごいことができるんじゃないか、とひそかに思ってるん ですけど。 98/07/04(土) まさーる(BYI20012)
小林さんは delegation 支持派でしたが,inner class の応用として COM を挙げられていました.
ところで,だれか Java inner-class を駆使したすごいプログラム作ってくれませんかねえ.知っているという方はぜひ連絡ください.
参考資料
Microsoft 側のページは今はなくなっているようです.