Ключевое слово метода Java «final» и его использование

Когда я создаю сложные иерархии типов (несколько уровней, несколько типов на уровень), мне нравится использовать ключевое слово 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);
}

Я делаю это по нескольким причинам:

  1. Это помогает мне развивать иерархию типов. Когда я добавляю класс в иерархию, становится очень ясно, какие методы я должен реализовать и какие методы я не могу переопределить (в случае, если я забыл подробности об иерархии)
  2. Я думаю, что переопределение конкретного материал плох в соответствии с принципами проектирования и шаблонами, такими как шаблон шаблонный метод шаблон. Я не хочу, чтобы это делали другие разработчики или мои пользователи.

Так что ключевое слово final идеально подходит для меня. У меня вопрос:

Почему он так редко используется в дикой природе? Можете ли вы показать мне несколько примеров / причин, по которым final (в случае, аналогичном моему) будет очень плохим?

5
задан Lukas Eder 15 January 2011 в 14:49
поделиться