Java 8 接口中静态方法的用途是什么?

What is the purpose of a static method in interface from Java 8?

为什么 Java 8 支持静态方法?下面代码中 main 方法中的两行有什么区别?

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 中实现。当我们可以在另一个 class 中编写相同的静态方法并调用它时,在接口中使用静态方法有什么用?它是否出于模块化以外的任何其他目的而引入。对于模块化,我的意思是:

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

只是把相似的方法放在一起。

过去,如果您有一个接口 Foo 并且想要将与接口相关的实用程序或工厂方法分组,则需要创建一个单独的实用程序 class FooUtils 和把所有东西都存在那里。

那些 classes 除了名称之外没有任何共同点,此外,utils class 需要制作 final 并有一个私有构造函数来禁止不必要的使用。

现在,由于接口静态方法,您可以将所有内容保存在一个地方,而无需创建任何额外的 classes。

同样重要的是不要忘记所有好的做法,不要盲目地将所有东西都扔到一个界面上 class - 正如

中所指出的

接口内部使用静态方法主要有两个原因:create instances 那些接口(代码显然在它必须在的地方);像 Predicate::isEqual 那样会创建一个基于 Predicate 的提供对象;或 Comparator::comparing,等等。第二个原因是 utility methods 对于所有这些类型都是通用的;喜欢 Stream::of

界面仍然必须 清晰,并且不必在 API 中制造额外的混乱。即使 jdk 代码也有 Collectors - 静态工厂方法,但同时有一个 Collector 接口。这些方法可以合并到 Collector 接口中,但这会使接口变得比它必须的更笨重。