为什么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";
}
}
只是把类似的方法放在一起。
答案 0 :(得分:16)
过去,如果您有一个接口Foo
并希望对与接口相关的工具或工厂方法进行分组,则需要创建一个单独的utils类FooUtils
并将所有内容存储在那里。
除了名称之外,这些类之外没有任何共同点,另外,utils类需要被创建final
并且有一个私有构造函数来禁止不必要的使用。
现在,由于接口静态方法,您可以将所有内容保存在一个位置而无需创建任何其他类。
同样重要的是不要忘记所有良好实践,不要盲目地将所有内容抛给一个接口类 - 正如this answer
中所指出的那样答案 1 :(得分:9)
接口内部静态方法主要有两个原因:这些接口的create instances
(代码显然是必须的);例如Stream.of
或Stream.generate
等。第二个原因是utility methods
是所有这些类型的通用。
接口必须清除,并且不必在API中创建额外的混乱。甚至jdk代码都有Collectors
- 静态工厂方法,但同时也是Collector
接口。这些方法可以合并到Collector
接口中,但这会使接口比以前更笨重。