Как уже упоминалось, final
используется с методом Java, чтобы отметить, что метод не может быть переопределен (для области объекта) или скрыт (для статического).Это позволяет первоначальному разработчику создавать функциональные возможности, которые не могут быть изменены подклассами, и это единственная гарантия, которую он предоставляет.
Это означает, что если метод опирается на другие настраиваемые компоненты, такие как непубличные поля / методы, функциональностьокончательного метода все еще может быть настраиваемым.Это хорошо, хотя (с полиморфизмом) допускает частичную настройку.
Существует ряд причин, по которым можно что-то не настраивать, в том числе:
Производительность - Некоторые компиляторы могут анализировать и оптимизировать работу, особенно такую, которая не имеет побочных эффектов.
Получение инкапсулированных данных - посмотрите на неизменяемыеОбъекты, где их атрибуты установлены во время строительства и никогда не должны быть изменены.Или вычисленное значение, полученное из этих атрибутов.Хорошим примером является класс Java String
.
Надежность и контракт - Объекты состоят из примитивов (int
, char
, double
и т. д.) и / или другие объекты.Не все операции, применимые к этим компонентам, должны быть применимы или даже логичны, когда они используются в большем объекте.Для этого можно использовать методы с модификатором final
.Класс Counter является хорошим примером.
public class Counter {
private int counter = 0;
public final int count() {
return counter++;
}
public final int reset() {
return (counter = 0);
}
}
Если public final int count()
метод не final
, мы можем сделать что-то вроде этого:
Counter c = new Counter() {
public int count() {
super.count();
return super.count();
}
}
c.count(); // now count 2
или как то так:
Counter c = new Counter() {
public int count() {
int lastCount = 0;
for (int i = super.count(); --i >= 0; ) {
lastCount = super.count();
}
return lastCount;
}
}
c.count(); // Now double count