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
接口中,但这会使接口变得比它必须的更笨重。
为什么 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
接口中,但这会使接口变得比它必须的更笨重。