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

2022-09-01 18:41:21

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

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

只是为了把类似的方法放在一起。


答案 1

过去,如果您有一个接口,并且想要对与接口相关的实用程序或工厂方法进行分组,则需要创建一个单独的 utils 类并将所有内容存储在那里。FooFooUtils

除了名称之外,这些类没有任何共同之处,此外,还需要创建utils类并具有私有构造函数以禁止不需要的使用。final

现在,由于接口静态方法,您可以将所有内容保存在一个位置,而无需创建任何其他类。

同样重要的是,不要忘记所有好的做法,不要盲目地把所有东西都扔到一个接口类上 - 正如这个答案中指出的那样


答案 2

接口内部的静态方法主要有两个原因:这些接口(代码显然是必须存在的地方);这样会创建一个基于提供的对象;或 等。第二个原因是,对于所有这些类型来说,这是通用的;喜欢create instancesPredicate::isEqualPredicateComparator::comparingutility methodsStream::of

但是,接口必须清晰,并且不必在API中造成额外的混乱。即使是jdk代码也有 - 静态工厂方法,但同时是一个接口的例子。这些方法可以合并到接口中,但这会使接口比它必须的更笨拙。CollectorsCollectorCollector