2017-08-20 13 views
8

なぜ静的メソッドがJava 8からサポートされていますか?以下のコードのmainメソッドの2行の違いは何ですか?Java 8からのインタフェースの静的メソッドの目的は何ですか?

package sample; 
public class A { 
    public static void doSomething() 
    { 
     System.out.println("Make A do something!"); 
    } 
} 

public interface I { 
    public static void doSomething() 
    { 
     System.out.println("Make I do something!"); 
    } 
} 

public class B { 
    public static void main(String[] args) { 
     A.doSomething(); //difference between this 
     I.doSomething(); //and this 
    } 
} 

我々は上記を参照できるように、私も、我々は別のクラスで同じ静的メソッドを作成し、それを呼び出すことができるとき、それはインターフェースの静的メソッドを持っているのに役立つだろうどのような目的B.に実装されていませんか?モジュール性以外の目的で導入されたのか?また、モジュール性とは、次のような意味です:

public interface Singable { 
    public void sing(); 
    public static String getDefaultScale() 
    { 
     return "A minor"; 
    } 
} 

同様の方法を組み合わせるだけです。

+3

これは説明する必要があります。https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html – Marvin

+1

違いはありません。 – Professor901

+1

静的メソッドは、クラスを実装するオーバーライドしないデフォルトメソッドを提供します。メソッドロジックがすべての実装に複製されている場合は特に便利です。 PopSongとRockSongはそれを実装することができ、両方ともデフォルトの位取りはAマイナーになります。 –

答えて

8

以前はインターフェイスFooがあり、インターフェイス関連のユーティリティやファクトリメソッドをグループ化したい場合は、別のutilsクラスFooUtilsを作成してすべてのものを保存する必要がありました。

これらのクラスは、名前以外に共通するものはありません。また、utilsクラスはfinalにする必要があり、不要な使用を禁止する専用のコンストラクタが必要です。

インターフェイスの静的メソッドのおかげで、追加のクラスを作成せずにすべてを1か所に保持できます。

それはすべての良い習慣を忘れていないし、1つのインターフェースクラスに無思慮にすべてを投げていないことも重要です - this answer

+1

@ GrzegorzPiwowarek 'Collectors'、' StreamSupport'、 'Spliterators'は冗長クラスではありません。インタフェースの中に*余りにも*あるコード用の行がなければなりません。 – Eugene

+1

@Eugeneもちろん、いくつかの例外がありますが、これは非常に良い例です。このすべてを1つのクラスに入れると、管理不能な混乱が生じるでしょう –

5

で指摘したようにインターフェース内の静的メソッドには2つの理由から主にあります。これらのインタフェースのcreate instances(とコードは明らかにどこにある必要がありますか)。 Stream.ofまたはStream.generateなどとなります.2番目の理由は、すべてのタイプに共通のutility methodsです。

なお、インターフェイスはクリアである必要があり、APIに追加のクラッタを作成する必要はありません。 jdkコードでも、Collectors - 静的ファクトリメソッドがありますが、たとえば、同時にCollectorインターフェイスです。これらのメソッドはCollectorインターフェイスにマージすることができますが、それはインターフェイスがもっと複​​雑なものになります。