2016-09-05 8 views
10

Java 8では、具体的なクラスに実装する必要がある宣言に加えて、インタフェースのメソッドのデフォルトの実装を持つことができます。メソッドを追加したり、インターフェイスにメソッドを追加したりしないでください。

インタフェースにデフォルトのメソッドを持たせるのがよい設計ですか、それともベストプラクティスですか、それともJava 8はこれまでのAPIをさらにサポートするために用意されていますか?新しいJava 8プロジェクトでデフォルトのメソッドを使うべきでしょうか?

ここに良いデザインが何であるかを詳しく教えてください。

+1

メソッドの「デフォルト」実装という言葉はありますか?インタフェース内のメソッドに* content *を追加する可能性は他にありません。 – Zabuza

+0

http://www.tutorialspoint.com/java8/java8_default_methods.htm ...私はSO上に重複を見つけることができなかったので、upvoted。 –

+0

IMHOは、デフォルトの方法を定期的に使用することは避けてください。また、デバッグを少し難しくすることがあります。また、実際にアーカイブする場合は、抽象クラスを使用して同じ機能を提供するため、 –

答えて

-1

以前のJavaバージョンでは、具体的なメソッドと宣言されたメソッドだけを使用する抽象クラスを持っていた可能性はありませんでした。 Java 8では、「デフォルトメソッド」または(Defenderメソッド)の新機能が導入されています。開発者はこれらのインターフェイスの既存の実装を破ることなく、新しいメソッドをインターフェイスに追加できます。これは、具体的なクラスがそのメソッドの実装を提供できない状況で、デフォルトとして使用するインタフェース定義の実装を可能にする柔軟性を提供します。

、それがどのように機能するかを理解するために、小さな例を考えてみましょう:

public interface oldInterface { 
    public void existingMethod(); 
     default public void newDefaultMethod() { 
     System.out.println("New default method" 
       " is added in interface"); 
    } 
} 

次のクラスは、Java JDK 8

public class oldInterfaceImpl implements oldInterface { 
    public void existingMethod() { 
     // existing implementation is here… 
    } 
} 

なぜDefaut方法で正常にコンパイルされますか? 既存のJDKフレームワークのリエンジニアリングは、常に非常に複雑です。 JDKフレームワークの1つのインタフェースを変更すると、インタフェースを拡張するすべてのクラスが分割されます。つまり、新しいメソッドを追加すると何百万行ものコードが壊れる可能性があります。したがって、デフォルトのメソッドは、後方互換性のある方法でインターフェイスを拡張するためのメカニズムとして導入されています。

:私たちはその常に推奨compatability.butこの後方をachiveすることができますしかし

インタフェースdelarationsとを使用するためには、それだけでは、彼らは最高のために使用されているものです。あなたはinterface Human_behaviourを持っている場合は、to_Walk(); to_Eat()のように、このインタフェースのすべてのアクションを利用することができ、簡単な例

to_Love()to_Fight()はすべての人間のオブジェクトのためにユニークな方法で、すべての実装クラスの例のために言う.Like

1人の人間は、銃などを使って剣と別のオブジェクトを使って戦うことができます。 したがって、インタフェースは祝福ですが、必要に応じて常に使用できます。インターフェイスを拡張する「合理的」な方法について話したときに

2

前java8、あなたがversioned capabilitiesに向けて探していた。

次のようなものがあります:

interface Capability ... 

interface AppleDealer { 
    List<Apples> getApples(); 
} 

とAppleDealerを取得するためには、そこにありますだからあなたのクライアントコードが実行されるだろう

public <T> T getCapability (Class<T> type); 

のようないくつかの中央サービス:

AppleDealer dealer = service.getCapability(AppleDealer.class); 

別の方法が必要でアップするとき、あなたが行く:

interface AppleDealerV2 extends AppleDealer { ... 

、V2は、ちょうどgetCapability(AppleDealerV2.class)コールを行いたいクライアント。気にしない人はコードを修正する必要はありません!

ご注意ください:もちろん、これはのインターフェイスを拡張します。このアプローチをシグネチャに変更することも、することも、既存のインターフェイスのメソッドを削除することはできません。

したがって、新しいメソッドをインターフェイスに追加するだけです。そのメソッドを実装するためにのデフォルト値はです。既存のクライアントコードを壊さずに巨大な進歩!

意味:既存のインターフェイスでのデフォルトメソッドを使用しないのはなぜですか? 既存のコードは気にしません。新しいデフォルトのメソッドについてはわかりません。

0

インターフェイスのデフォルトメソッドにはいくつかの制限があります。 Interfaceでデータ変数を使用することはできません。一般的に、以下の理由によりデフォルトのメソッドが追加されました。以前のバージョンでは、インターフェース "A"を実装するクラスを作成しました。次のバージョンでは、インターフェース "A"にメソッドを追加することをお勧めします。しかし、 "A"を実装しているどのクラスもその余分なメソッドを持たず、コンパイルもできないので、そうすることはできません。これは主要な下位互換性の内訳です。したがって、Java 8では、インターフェースにデフォルトのメソッド実装を追加することができるので、 "A"の古いバージョンを実装したすべてのクラスは壊れませんが、デフォルト実装に戻ります。実際には、既存のインターフェイスを拡張する必要がある場合にのみ、この機能を控えめに使用してください。

関連する問題