Effective Javaを読んでいる⑱

抽象クラスよりもインターフェースを選べ

抽象クラス

実装が持てる

インターフェース

・実装が持てない(Java 8からstaticなメソッドは実装できるけど)
・クラスの階層にかかわらず実装出来る

既存クラスを抽象クラスのサブクラスしようとすると

既存クラスが継承するクラスの継承するクラスの継承するクラス・・・に抽象クラスを継承させなければならない(それがもし概念として正しくなくても)

mixins

なんかに(オプション的な)新しい振る舞いを提供するためのインターフェース
Comparableとか

単一継承がうまくはまらないケース

SmartPhoneクラスに抽象クラスPhoneと抽象クラスMusicPlayerを継承させたいみたいな

組み合わせ爆発

【Effective Java】項目18:抽象クラスよりインタフェースを選ぶ - The King's Museum

インターフェースはメソッド実装を含むことが出来ないが、実装する誰かへの実装の手助け(のためのコード)を妨げるわけではない

abstract skeletal implementation

ここだけ実装しとけばとりあえずあんたの希望は満たされるよ的なインターフェースに対する実装(抽象クラス)
インターフェースを直接実装させた場合インターフェースにメソッドを追加すると既存の実装クラスがぶっこわれる。コンパイルもできない。
abstract skeletal implementationを継承させる形ならインターフェースにメソッド追加したときにあわせて追加すれば大丈夫。
でも直接インターフェースを実装してるクラスはやっぱり壊れる。→慎重に設計しようねてきなやつ。

ようするにインターフェースは一度公開してみんながおのおのの実装を作ってしまったあとで、いじくるのがめっちゃ難しい。
なんかまずかったら?あたらしいインターフェースを作ってそっちを実装してもらおう。古いやつは凍結しよう。

めちゃめちゃ小規模な開発(そしてソースコードが組織内で完全に閉じてるやつ)しかしたことないと効果が実感しづらい(おれはそう)