Looking for java Keywords? Try Ask4Keywords

Java Language Использование «final» для ограничения наследования и переопределения


пример

Финальные классы

При использовании в объявлении class final модификатор запрещает объявлять другие классы, extend класс. final класс - это «лист» в иерархии классов наследования.

// This declares a final class
final class MyFinalClass {
    /* some code */
}

// Compilation error: cannot inherit from final MyFinalClass
class MySubClass extends MyFinalClass {
    /* more code */
}

Варианты использования для финальных классов

Заключительные классы можно комбинировать с private конструктором для управления или предотвращения создания экземпляра класса. Это можно использовать для создания так называемого «класса утилиты», который определяет только статические элементы; т.е. константы и статические методы.

public final class UtilityClass {

    // Private constructor to replace the default visible constructor
    private UtilityClass() {}

    // Static members can still be used as usual
    public static int doSomethingCool() {
        return 123;
    }

}

Неизменяемые классы также должны быть объявлены final . (Неизменяемый класс - это тот, чьи экземпляры не могут быть изменены после их создания, см. Тему I mmutable Objects .) При этом вы не можете создать изменяемый подкласс неизменяемого класса. Это нарушит Принцип замещения Лискова, который требует, чтобы подтип должен подчиняться «поведенческому контракту» его супертипов.

С практической точки зрения, объявляя неизменный класс final легче рассуждать о поведении программы. Он также рассматривает проблемы безопасности в сценарии, где ненадежный код выполняется в изолированной программной среде. (Например, поскольку String объявляется final , доверенный класс не должен беспокоиться о том, что его можно обмануть в принятии изменяемого подкласса, который ненадежный вызывающий абонент мог бы тайно изменить.)

Одним из недостатков final классов является то, что они не работают с некоторыми насмешливыми фреймворками, такими как Mockito. Обновление: версия Mockito 2 теперь поддерживает насмешку над финальными классами.

Конечные методы

final модификатор также может применяться к методам предотвращения их переопределения в подклассах:

public class MyClassWithFinalMethod {

    public final void someMethod() {
    }
}

public class MySubClass extends MyClassWithFinalMethod {

    @Override
    public void someMethod() { // Compiler error (overridden method is final)
    }
}

Конечные методы обычно используются, когда вы хотите ограничить то, что подкласс может изменить в классе, без полного запрещения подклассов.


final модификатор также может применяться к переменным, но значение final для переменных не связано с наследованием.