界定具体方法的界面 - 在什么情况下允许这样做?

时间:2017-05-03 13:17:15

标签: java spring spring-security

在浏览spring安全模块时,我在Principal Interface类中遇到了这段代码。我的理解是接口没有实现任何具体的东西。

接口内的下面一段代码是什么原因?

public interface Principal {     
 //other method definitions

  public default boolean implies(Subject subject) {
    if (subject == null)
      return false;
    return subject.getPrincipals().contains(this);
  }
}

2 个答案:

答案 0 :(得分:2)

这些被称为默认方法;并随Java8一起推出。

引用Oracle tutorial

  

默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码具有二进制兼容性。

含义:从java8开始,我们实际上可以将行为添加到接口中。我们的想法是更容易增强现有接口 - 而不是为Java提供“通用”mixin/trait概念。

换句话说:根据Java背后的人,default主要原因是需要增强许多现有的集合接口以支持新的 stream < / em>范例。

值得指出的是,Java8接口还支持静态方法:

  

除了默认方法,您还可以在接口中定义静态方法。 (静态方法是一种与定义它的类相关联的方法,而不是与任何对象相关联。该类的每个实例都共享其静态方法。)

答案 1 :(得分:1)

这是接口的默认方法,自Java 8起可用。 它是一种允许开发人员在不破坏现有实现的情况下向接口添加新方法的功能。它提供了灵活性,允许接口定义实现,在具体类无法为该方法提供实现的情况下将默认使用。

  

从框架甚至从框架重构现有接口   JDK很复杂。修改一个接口会破坏所有类   扩展接口,这意味着添加任何新方法都可以   打破数百万行代码。因此,默认方法有   引入作为向后扩展接口的机制   兼容的方式。

另一个潜在的用法是从接口调用其他方法,例如在forEach选项中,您可以获取list参数并调用另一个只接受一个元素的方法。

我个人认为,默认方法应尽量少使用,不得包含任何业务逻辑。它主要用于保持旧接口(10年以上)的复古兼容性。

更多详情:https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html https://dzone.com/articles/interface-default-methods-java