当我创建复杂类型层次结构(几个级别,每个级别几个类型)时,我喜欢在实现某些接口声明的方法上使用final关键字.一个例子:
interface Garble {
int zork();
}
interface Gnarf extends Garble {
/**
* This is the same as calling {@link #zblah(0)}
*/
int zblah();
int zblah(int defaultZblah);
}
然后
abstract class AbstractGarble implements Garble {
@Override
public final int zork() { ... }
}
abstract class AbstractGnarf extends AbstractGarble implements Gnarf {
// Here I absolutely want to fix the default behaviour of zblah
// No Gnarf shouldn't be allowed to set 1 as the default, for instance
@Override
public final int zblah() {
return zblah(0);
}
// This method is not implemented here, but in a subclass
@Override
public abstract int zblah(int defaultZblah);
}
我这样做有几个原因:
>它帮助我开发类型层次结构.当我向层次结构添加一个类时,非常清楚,我必须实现哪些方法,以及我可能不会覆盖哪些方法(如果我忘记了有关层次结构的详细信息)
>根据设计原则和模式,例如模板方法模式,我认为压倒具体的东西是不好的.我不希望其他开发人员或我的用户这样做.
所以最终关键字对我来说非常合适.我的问题是:
为什么它在野外很少使用?你能告诉我一些例子/原因,最终(在类似情况下我的)会非常糟糕吗?