Luk*_*der 5 java final overloading keyword
当我创建复杂类型层次结构(几个级别,每个级别几个类型)时,我喜欢final在实现某些接口声明的方法上使用关键字.一个例子:
interface Garble {
int zork();
}
interface Gnarf extends Garble {
/**
* This is the same as calling {@link #zblah(0)}
*/
int zblah();
int zblah(int defaultZblah);
}
Run Code Online (Sandbox Code Playgroud)
然后
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);
}
Run Code Online (Sandbox Code Playgroud)
我这样做有几个原因:
template method.我不希望其他开发人员或我的用户这样做.所以final关键字对我来说非常合适.我的问题是:
为什么它在野外很少使用?你能告诉我一些例子/原因final(在类似情况下我的)会非常糟糕吗?
为什么它在野外很少被使用?
这与我的经历不符。我发现它在各种图书馆中使用得非常频繁。仅举一个(随机)示例:查看以下中的抽象类:
http://code.google.com/p/guava-libraries/
,例如 com.google.common.collect.AbstractIterator。peek()、hasNext()、next()和endOfData()是最终的,只留给computeNext()实现者。在我看来,这是一个非常常见的例子。
反对使用的主要原因final是允许实现者更改算法 - 您提到了“模板方法”模式:修改模板方法或通过一些前/后操作来增强它仍然是有意义的(而不是向整个模板方法发送垃圾邮件)具有数十个前/后挂钩的类)。
使用的主要原因final是为了避免意外的实现错误,或者当该方法依赖于未指定的类的内部结构时(因此将来可能会发生变化)。