引言
本文是 OnJava 接口部分的学习笔记。
结论 “优先使用类而不是接口”。
从类设计开始,如果很明显接口是必要的,那么就重构。任何抽象都应该由真正的需求来驱动。接口应该是酒必要时用来重构的东西,而不是在任何地方都多加一个间接层级,进而带来额外的复杂性。
接口的内部匿名类
public class MetalWork {public static void main(String[] args) {//内部匿名类实现,必须在静态上下文中定义才能使用方法引用Operation twist = new Operation() {public void execute() {Operation.show("Twist");}};Operation.runOps(new Heat(), twist::execute);}
}class Heat implements Operation {@Overridepublic void execute() {Operation.show("Heat");}
}
在给定的代码中,可以使用 twist::execute 是因为 twist 是一个实现了 Operation 接口的匿名内部类的实例。当有一个函数式接口(只有一个抽象方法的接口)时,可以使用 Lambda 表达式或方法引用来代替实现该接口的匿名内部类。
子类返回值增强
注意只能是 Object->String, 而不能是 String->Integer
public interface StringProcessor extends Processor {@Override//方法增强,从Object转化为StringString process(Object input);
}public interface Processor {default String name() {return getClass().getSimpleName();}Object process(Object input);
}
嵌套 interface
class A {private interface D {void f();}private class DImp implements D {@Overridepublic void f() {System.out.println("hello f");}}public class DImp2 implements D {@Overridepublic void f() {System.out.println("hello f");}}public D getD() {return new DImp2();}private D dRef;public void recevice(D d) {dRef = d;dRef.f();}
}public class NestingInterfaces {public static void main(String[] args) {A a = new A();A.D ad = a.getD(); // 只能用A.D来接受getD()的返回值A.DImp2 di2 = a.getD(); // wronga.getD().f(); // wrong NestingInterfaces类无法访问private Interface里的方法A a2 = new A();a2.recevice(a.getD()); // 选择A的内部类来调用 interface D中的方法}
}
参考资料
- https://www.ituring.com.cn/book/2935