Java方法关键字"final"及其使用

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)

我这样做有几个原因:

  1. 它帮助我开发类型层次结构.当我向层次结构添加一个类时,非常清楚,我必须实现哪些方法,以及我可能不会覆盖哪些方法(如果我忘记了有关层次结构的详细信息)
  2. 我认为根据设计原则和模式,例如模式,压倒具体的东西是不好的template method.我不希望其他开发人员或我的用户这样做.

所以final关键字对我来说非常合适.我的问题是:

为什么它在野外很少使用?你能告诉我一些例子/原因final(在类似情况下我的)会非常糟糕吗?

Chr*_*her 2

为什么它在野外很少被使用?

这与我的经历不符。我发现它在各种图书馆中使用得非常频繁。仅举一个(随机)示例:查看以下中的抽象类:

http://code.google.com/p/guava-libraries/

,例如 com.google.common.collect.AbstractIterator。peek()hasNext()next()endOfData()是最终的,只留给computeNext()实现者。在我看来,这是一个非常常见的例子。

反对使用的主要原因final是允许实现者更改算法 - 您提到了“模板方法”模式:修改模板方法或通过一些前/后操作来增强它仍然是有意义的(而不是向整个模板方法发送垃圾邮件)具有数十个前/后挂钩的类)。

使用的主要原因final是为了避免意外的实现错误,或者当该方法依赖于未指定的类的内部结构时(因此将来可能会发生变化)。