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

时间:2017-08-20 10:07:46

标签: java class interface java-8 static-methods

为什么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";
    }
}

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

2 个答案:

答案 0 :(得分:16)

过去,如果您有一个接口Foo并希望对与接口相关的工具或工厂方法进行分组,则需要创建一个单独的utils类FooUtils并将所有内容存储在那里。

除了名称之外,这些类之外没有任何共同点,另外,utils类需要被创建final并且有一个私有构造函数来禁止不必要的使用。

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

同样重要的是不要忘记所有良好实践,不要盲目地将所有内容抛给一个接口类 - 正如this answer

中所指出的那样

答案 1 :(得分:9)

接口内部静态方法主要有两个原因:这些接口的create instances(代码显然是必须的);例如Stream.ofStream.generate等。第二个原因是utility methods是所有这些类型的通用。

接口必须清除,并且不必在API中创建额外的混乱。甚至jdk代码都有Collectors - 静态工厂方法,但同时也是Collector接口。这些方法可以合并到Collector接口中,但这会使接口比以前更笨重。