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