答案很多,但我虽然会加上自己的$ 0.02。
我不经常重写concreate类,但是在某些特定情况下。在设计框架类以进行扩展时,至少已经提到了1种。我想到了另外两个例子:
1)如果我想调整具体班级的行为。有时,我想更改具体类的工作方式,或者想知道何时调用某个方法,以便触发某些事情。通常,具体的类会定义一个hook方法,其唯一用法是子类重写该方法。
示例:我们MBeanExporter
之所以无法实现,是因为我们需要能够注销JMX bean:
public class MBeanRegistrationSupport {
protected void onRegister(ObjectName objectName) {
}
我们班:
public class UnregisterableMBeanExporter extends MBeanExporter {
@Override
protected void onUnregister(ObjectName name) {
super.onRegister(name);
objectMap.remove(name);
}
这是另一个很好的例子。 LinkedHashMap
旨在使其removeEldestEntry
方法被重写。
private static class LimitedLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
@Override
protected boolean removeEldestEntry(Entry<K, V> eldest) {
return size() > 1000;
}
2)如果一个类与具体的类有很多重叠,除了对功能的一些调整。
示例:我的ORMLite项目处理持久化的Long
对象字段和long
原始字段。两者的定义几乎相同。 LongObjectType
提供描述数据库如何处理long
字段的所有方法。
public class LongObjectType {
whileLongType
覆盖LongObjectType
并且仅调整一个单一的方法来处理原语。
public class LongType extends LongObjectType {
...
@Override
public boolean isPrimitive() {
return true;
}
}
希望这可以帮助。