Java8 中的静态方法

Static methods in Java8

Java8 允许接口有静态方法。如果有人解释在哪种情况下我们可能需要使用静态方法进行接口,那将非常有帮助。

提前致谢。

可以找到资源here and here:

  1. Java接口静态方法是接口的一部分,我们不能用它来实现class个对象。
  2. Java接口静态方法有利于提供实用方法,例如null检查、集合排序等
  3. Java 接口静态方法通过 不允许实现 class 重写它们 .
  4. 来帮助我们提供安全性
  5. 我们不能为 Object class 方法定义接口静态方法,我们会得到编译器错误“这个静态方法不能隐藏 Object 的实例方法”。这是因为 java 中不允许这样做,因为
  6. 对象是所有 class 对象的基础 class,我们不能有一个 class 级静态方法和另一个具有相同签名的实例方法。
  7. 我们可以使用 java 接口静态方法来删除实用程序 class ,例如 Collections 并将其所有静态方法移动到相应的接口,这将很容易找到和使用。

您是否搜索了 jdk 来源?至少举两个例子怎么样:

 Function.identity()

有如下实现:

static <T> Function<T, T> identity() {
    return t -> t;
}

Predicate.isEqual 看起来像:

static <T> Predicate<T> isEqual(Object targetRef) {
    return (null == targetRef)
            ? Objects::isNull
            : object -> targetRef.equals(object);
} 

通常 我将它们视为静态工厂方法,return 返回该接口的一个实例。

我有一个我们在代码库中使用的很好的例子 (but it comes from Holger initially):

public interface UncheckedCloseable extends Runnable, AutoCloseable {
    @Override
    default void run() {
        try {
           close();
        } catch (Exception ex) {
           throw new RuntimeException(ex);
        }
    }

    static UncheckedCloseable wrap(AutoCloseable c) {
       return c::close;
    }

    default UncheckedCloseable nest(AutoCloseable c) {
        return () -> {
            try (UncheckedCloseable c1 = this) {
                c.close();
            }
        };
    }
 } 

据我了解-

1.These 方法不能被继承它的 类 覆盖。

2.They 只能被该接口的函数访问(不能被覆盖)。

因此,只要您希望接口的函数(不是静态的也不是被覆盖的)使用该函数(静态的),就可以使用它们。

所以你可以在里面使用你自己的业务逻辑,你自己的排序方式,一些限制或边界。

所以它可以像有人调用你的函数一样使用,你在其他函数的帮助下在其中做你自己的事情。这就像另一个程序员实现你的接口来使用一些功能,为自己的程序提供一些支持(例如,可以保存笔记、计划会议等的日历)。

但请记住,您不应该覆盖调用那些静态函数的函数。