java8

interfaceのデフォルト実装

More than 3 years have passed since last update.


Abstractなんちゃらはオワコン

rubyやscalaなどではお馴染みのtrait。多重継承をさせずに多重継承のような事を実現する仕組みです。

このクラスにはアレとコレとソレを継承させたいといった時、今までのjavaなら全部を順番に継承するか、もしくはinterfaceとして実装をする他ありませんでした。


areKoreSore.java

// 継承する

class Are { }
class Kore extends Are { }
class Sore extends Kore { }

class Oresama extends Sore { }

// 実装する
interface Are { }
interface Kore { }
interface Sore { }

class Oresama implements Are, Sore, Kore { }


しかしこの方法は問題だらけです。

ます継承のパターンでは、俺様が他のクラスを継承するのはよいとしても、他のクラス同士がis-aの関係になるとは限りません。あくまでもアレはアレ、ソレはソレです。

一方実装のパターンではそれぞれのinterfaceの独立性は保たれますが、いかんせん俺様ですべてのメソッドを実装しなくてはならなくなります。その上、似たようなクラス「Anatasama」ができた時、同じような実装コードを書かなければなりません。それを回避するために標準ライブラリなどでは「Abstractなんちゃら」っていうinterfaceのデフォルトを実装しただけの抽象クラスがたんまり用意されてたりしますが、俺様がそれを継承してしまうと、他のクラスを継承できなくなり、そんなことで貴重な継承ツリーを消費したくありません。

せめて、interfaceにメソッドの実装がかけたらどんなに楽か。。。

ってのがjava8では可能になりました。


default.java

interface Are {

default void doAre() { ... };
}
interface Kore {
default void doKore() { ... };
}
interface Sore {
default void doSore() { ... };
}

class Oresama implements Are, Kore, Sore { }


interface内でdefaultキーワードをつけると実装を持たせる事ができます。

その名の通り、あくまでデフォルトの実装なので、当然オーバーライドすることもできます。

このようにして作った俺様は当然アレやコレの変数に代入することもできます。


dainyu.java

Are are = new Oresama;


interfaceに実装を与える事ができるようになったことで、なかり柔軟なクラス設計が可能となりました。