interface と abstract class をどのように使い分けるのですか?

随分前に(1年半くらい前)これを見ていまいち判然としないなーと思っていたのですが、最近こう理解しつつあります。

  • 基本はinterfaceを使う
  • Abstractクラスは次のどちらかとしてのみ使う
    1. インタフェースの骨格実装(コレクションフレームワークのAbstractListみたいなの)
    2. ファクトリクラス(NumberFormatみたいなの)
  • こういうことはしない(ほうがいいんじゃないかと思う)。
// 継承関係があるとする
AbstractClass ac = new ConcreatClass();

こういうときは潔くinterfaceをつくってinterfaceの型で扱う。(AbstractClassは骨格実装の役割にさせる)