使现有Java接口有功能存在危险吗?

Fra*_*ris 9 java lambda functional-interface

通常,在大型项目的上下文中,将现有的,无处不在的接口用于功能接口是否安全?

例如,给定一个现有的接口和类:

public interface Interface {
    public double calculateSomething(double x);
    public void doSomething();
}
Run Code Online (Sandbox Code Playgroud)

由...实施

class InterfaceImplementer implements Interface {

     public double calculateSomething(double x) {
          return 2 * x;
     }

     public void doSomething() {
         // insert specific behavior here
     } 
}
Run Code Online (Sandbox Code Playgroud)

我可以通过定义除一个方法之外的所有方法来安全地更改界面:

public interface Interface {
    public double calculateSomething(double x);

    default void doSomething() {
         // insert some default behavior here
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以将对象定义为

Interface object = new InterfaceImplementer() {

    @Override
    public double calculateSomething(double x) {
        return 2 * x;
    }
};
Run Code Online (Sandbox Code Playgroud)

Interface object = (x) -> 2 * x;
Run Code Online (Sandbox Code Playgroud)

同时仍然能够以旧的,乏味的方式定义对象.

据我所知,这不会有任何现有代码的风险,我已经对大型项目进行了这样的更改,并且没有运行时或编译错误.但我想要确认这是否符合常识和最佳实践.

Tho*_*sen 8

任何只有一个非默认方法的接口(只需要在一个类中实现一个方法)根据定义是一个功能接口.这是一个很好的规则!

但是,@FunctionalInterface注释具有强制执行 "功能接口的接口中只有一种方法" 的优点.因此,如果将其添加到原始的双方法接口,则会出现编译器错误.因此,通过明确添加,@FunctionalInterface您声明您的意图,并使您的代码更清晰,以便未来的维护者.


Tim*_*kle 1

Java API规定:

但是,无论接口声明中是否存在FunctionalInterface注释,编译器都会将满足函数式接口定义的任何接口视为函数式接口。

因此添加该注释没有风险。