好吧,这是一个完美的教学法,告诉您程序员为什么不应该扩展不是为子类设计的类。诸如“ Effective
Java”之类的书告诉您原因:当超类演化时,尝试拦截每种方法以改变其行为的尝试将失败。
在这里,
IndirectList扩展
Vector并覆盖几乎所有修改其行为的方法,这是一种清晰的反模式。现在,随着Java 8基类的发展。
从Java
8开始,接口可以具有
default方法,因此
sort添加了类似的方法,这些方法的优点在于,与
Collections.sort实现不同,实现可以覆盖该方法,并提供更适合特定
interface实现的实现。
Vector这样做有两个原因:现在所有协定都
synchronized扩展为排序,并且优化的实现可以将其内部数组传递给该
Arrays.sort方法,从而跳过先前实现中已知的复制操作(
ArrayList执行相同操作)。
为了立即获得这种好处,即使对于现有代码,
Collections.sort也已进行了改进。它委托
List.sort默认情况下将委托给另一个方法,该方法实现通过
toArray和使用复制的旧行为
TimSort。但是,如果
List实现重写,
List.sort则也会影响行为
Collections.sort。
interface method using internal List.sort array w/o copyingCollections.sort ─────────────────> Vector.sort ─────────────────> Arrays.sort



