既然Java有lambda,那么编写API的最佳实践已经发生了很大变化。例如,模板方法模式[Gamma95],其中子类重写基本方法以具体化其超类的行为,远没那么有吸引力。现在的替代方案是提供一个静态工厂或构造函数,它接受一个函数对象来实现相同的效果。更一般地说,你将编写更多以函数对象作为参数的构造函数和方法。需要谨慎地选择正确的功能参数类型。
考虑LinkedHashMap。你可以通过重写其受保护的removeEldestEntry方法将此类用作缓存,该方法每次将新key添加到map时都会调用。当此方法返回true时,map将删除其最旧的entry,该entry将传递给该方法。 以下覆盖允许地图增长到一百个entry,然后在每次添加新key时删除最旧的entry,保留最近的一百个entry:
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return size() > 100;
}
这种技术【实现方式】很好,但你可以用lambdas做得更好。如果今天编写LinkedHashMap,它将有一个带有函数对象的静态工厂或构造函数。查看removeEldestEntry的声明,你可能会认为函数对象应该采用Map.Entry <K,V>并返回一个布尔值,但是不会这样做:removeEldestEntry方法调用size()来获取map中entry的数目,因为removeEldes