web-dev-qa-db-ja.com

Java 8からのインターフェースの静的メソッドの目的は何ですか?

静的メソッドがJava 8からサポートされているのはなぜですか?以下のコードのmainメソッドの2行の違いは何ですか?

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";
    }
}

同様のメソッドを組み合わせるだけです。

14
Tarun Mohandas

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

これらのクラスには、名前以外の共通点はありません。さらに、utilsクラスをfinalにして、不要な使用を禁止するプライベートコンストラクターを作成する必要があります。

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

this answer で指摘されているように、すべての優れたプラクティスを忘れず、すべてを1つのインターフェイスクラスに無意識に投げ込まないことも重要です。

18

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

それでも、インターフェースはclearである必要があり、APIで余分な混乱を作成する必要はありません。 jdkコードにもCollectors-静的なファクトリメソッドがありますが、たとえば、同時にCollectorインターフェースがあります。これらのメソッドをCollectorインターフェースにマージすることもできますが、そうするとインターフェースが必要以上に扱いにくくなります。

9
Eugene