programmerこの広告は、90日以上更新していないブログに表示しています。インターフェースをnewする?プログラミング[id:lethevert:20060207:p1]の続き。Listは明らかに例が悪いListに限らず、コレクション系は、実装によってその性能特性がものすごく変わる。まじめに計算量のことを考えているプログラマなら、どんな場合でもそのListの実装がどうでもいいなんてことにはならないと思う。見極めたと思っても後で状況が変わるかもしれないので、後から実装を差し替えたときに、コード全体にその影響を及ぼさないようにするための、初歩的な抽象化のため慣習があるからだ。ArrayList();と書いておくのが、作法として望ましい。(もしかしたら、事情が変わって別の実装に差し替える可能性があるから)インターフェースは動作を定義しないJavaのインターフェースは、操作のセットを定義するものであって、そのオブジェクトの動作や特性を定義するものではない。本当に、シンプルに、あるオブジェクトが理解するメッセージを列挙するだけの機能しかなく、その中に動作に関する定義を紛れ込ませる隙はないからだ。*1もし、どんなにドキュメントやコメントでそれを定義したところで、コンパイラはそれを無視する。頭のいかれたオブジェクトが、addしたオブジェクトを破壊してしまったところで、インターフェースの意味からは、その動作が間違っているとは言えない。動作に関する定義を記述したければ、以下のような内容をインターフェースの記述に含んでいる必要がある。(記法はオリジナル*2。Listの全ての動作を定義しているわけではない。list.get(i)しかし、実装に本当に興味がないこともある数なんてどうか?整数が欲しいことがある。32bit整数は欲しくない。いえ、32bitの範囲に収まるなら32bit整数として計算しておいてもらった方が、余分なリソースを食わないので嬉しい。いうインテリジェンスをVMなりランタイムなりの求めたい。Integer(1);という書き方をして、実際には、Int32型オブジェクトができていてくれたりすると嬉しいかもしれない。下のような書き方はしたくない。BigInt(10000000000)そして、計算しているうちに32bitを超えた場合には、自動的にBigInt型オブジェクトに変わっていると非常に嬉しい。Int32(1);これは常にInt32でいて、オーバーフローした場合は、32bit整数として自然な形で桁あふれして欲しい。自動的にBitInt型オブジェクトに変わらないで欲しい。*1:もっとも、Javaの開発者のなかでも、ここの理解には混乱があるようで、java.lang.Cloneableインターフェースなどは、明らかにインターフェースが持ち得ない何か(つまり動作の定義)を期待している。月別アーカイブはてなブログをはじめよう!lethevertさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。