当我创建复杂的类型层次结构(多级,每级多种类型)时,我喜欢在实现某些接口声明的方法上使用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);
}
我这样做有几个原因:
- 它帮助我开发类型层次结构。当我向层次结构添加一个类时,非常清楚,我必须实现哪些方法,以及哪些方法可能不能覆盖(如果我忘记了有关层次结构的详细信息)
- 根据设计原则和模式(如模板方法模式),我认为覆盖具体内容是不好的。我不希望其他开发人员或我的用户这样做。
所以final
关键字对我来说非常完美。我的问题是:
为什么在实际使用中它很少被使用?你能否给我展示一些例子/理由,在类似情况下使用final
会非常糟糕?
zblah
返回的所有值。最简单的方法是覆盖它,但是我不能在您的API中这样做。当然,这个例子还不够好。 - Stan Kurilin