引言
本文是 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 {
@Override
public void execute() {
Operation.show("Heat");
}
}
在给定的代码中,可以使用 twist::execute 是因为 twist 是一个实现了 Operation 接口的匿名内部类的实例。当有一个函数式接口(只有一个抽象方法的接口)时,可以使用 Lambda 表达式或方法引用来代替实现该接口的匿名内部类。
子类返回值增强
注意只能是 Object->String, 而不能是 String->Integer
public interface StringProcessor extends Processor {
@Override
//方法增强,从Object转化为String
String 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 {
@Override
public void f() {
System.out.println("hello f");
}
}
public class DImp2 implements D {
@Override
public 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(); // wrong
a.getD().f(); // wrong NestingInterfaces类无法访问private Interface里的方法
A a2 = new A();
a2.recevice(a.getD()); // 选择A的内部类来调用 interface D中的方法
}
}