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