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

问题描述 投票:0回答:3

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

正如我们在上面看到的,I 甚至没有在 B 中实现。当我们可以在另一个类中编写相同的静态方法并调用它时,在接口中拥有静态方法有什么用呢?除了模块化之外,它的引入是否还有其他目的?我所说的模块化是指:

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

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

java class interface java-8 static-methods
3个回答
35
投票

在过去,如果您有一个接口

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

这些类除了名称之外没有任何共同点,此外,需要创建 utils 类

final
并有一个私有构造函数来禁止不必要的使用。

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

同样重要的是不要忘记所有好的实践,不要盲目地将所有内容都扔给一个接口类 - 正如这个答案

中所指出的

15
投票

接口内部使用静态方法主要有两个原因:

create instances
这些接口(并且代码很清楚它必须在哪里);就像
Predicate::isEqual
一样,它会创建一个基于
Predicate
的提供对象;或
Comparator::comparing
等。第二个原因是
utility methods
,对于所有这些类型都是通用的;喜欢
Stream::of

界面仍然必须清晰,并且不必在 API 中造成额外的混乱。甚至 jdk 代码也有

Collectors
- 静态工厂方法,但同时有
Collector
接口。这些方法可以合并到
Collector
接口中,但这会使接口变得更加笨重。


0
投票

Java 8 接口中静态方法的原因是什么? 原因是:我们可以通过接口名称调用静态方法,并且该静态方法可以在内部调用默认方法。 ex : Comparator::compareing,所以这里的比较是调用默认功能。

© www.soinside.com 2019 - 2024. All rights reserved.