Java : インターフェースをnewする?
みずしまさんとこを発端に、(おおもとは[id:hiuchida:20051228#1135766855])
List list = new List();
と書くことについて盛り上がっていますが、なぜこの書き方に支持が集まるのかよく分からないのですが・・・
というか、こういうことが書きたければ、
- Listをclassとして作って、
- ArrayListとLinkedListは、Listの実装を全てオーバーライドする(もしくは何もオーバーライドしない)
ということにすればいい(orすることと同じ)ような気がするのですが、それだと、実装とインターフェースを分けたいからListをインターフェースにするという設計のセンスを根本的に否定しているんじゃないでしょうか?
私個人の感覚で言うと、
List list = new LinkedList();
と書くスタイルに、Javaらしい実装に対する予断を持たない面が見えて、むしろ好きなのですが。というのも、もしListインターフェースが何かの実装を暗示しているなら、結局、やはり何らかの実装を選択していることになるわけで、そんなくらいなら見せておけばいいんじゃない?と思うのです。
とか思っていたところ、[id:quintia:20060207]のコメント欄で、id:hiuchidaさんの
「開発当初は製品Aの実装クラスを使っていたが、そのうちに製品Bの実装クラスの方が実績がある」みたいなとき
というコメントを見て、たしかに後から交換したいとすればそういうことはあるわけだけど、そんなときはファクトリを作ったり、そこでさらにリフレクションを使ったり、いっそ何かのフレームワークに任せたり、grepして置換したりといろいろやりようはあって、でも結局それは、
List list = new LinkedList();
というようにインターフェース型で取り扱っているからできる芸当で、言語としてはそれでいいんじゃない?と思うのです。
だから、やっぱり、なぜ "new List();" が支持を集めるのかがよくわからない。