Подтвердить что ты не робот

Когда следует использовать "final"?

Есть ли какая-либо конкретная причина, по которой я должен объявить класс или метод final в повседневном программировании (в Интернете или в другом случае)? Пожалуйста, предоставьте реальный пример, где он должен использоваться.

Кстати, я прошу, потому что я пытаюсь выбрать "неясную" 'ключевое слово и мастер.

4b9b3361

Ответ 1

Это мешает другим программистам делать вещи с вашими классами, которые вы им не намереваетесь делать. Поэтому вместо того, чтобы комментировать "не использовать этот класс для выполнения XXX", вы можете его спроектировать таким образом, чтобы у них не возникло соблазна переопределить его и оскорбить его таким образом.

Изменить. Поскольку запрос запрашивается, я опишу случай, когда вы можете найти это ключевое слово под рукой... скажем, у вас есть класс, который определяет, как два объекта могут взаимодействовать друг с другом, скажем, слушателя и уведомителя. Класс слушателя должен, очевидно, разрешать наследование, но вы можете сделать окончательный класс notifier таким, чтобы его можно было использовать в отношении "has-a". Таким образом, вы можете сделать некоторые предположения из ваших объектов-слушателей о характере сообщений, которые они получают.

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

Другой пример: скажем, у вас есть потоковый процессор на основе буфера и внутри вашего метода read()/write(), вы сохраняете некоторые данные о текущем состоянии вашего объекта (то есть текущий байт или что-то еще), Невозможно гарантировать, что кто-либо, подклассифицирующий этот класс, будет называть супер методы во время обработки, - и поскольку такой класс, вероятно, содержит только несколько методов, лучше просто сделать все окончательное вместо каждого метода. Это снова заставляет людей использовать класс "has-a", а не "is-a", и, таким образом, может контролировать, как вы ожидаете, что код будет выполнен.

Я согласен с вами в том, что создание финала всего класса, вероятно, будет чем-то, что вам нужно будет сделать один раз в синей луне, но приятно, что PHP имеет эту возможность, если вы решите его реализовать.

Ответ 2

"Enforce Composition over Inheritance" делает это довольно лаконично. Вы гарантируете определенное поведение вашего класса, которое ничто иное не может помешать, что, как поясняется в следующем разделе, также может иметь преимущества безопасности.

Ответ 3

Некоторые люди утверждают, что вы должны объявить классы all final, если вы специально не собираетесь разрешать и изучали последствия его полиморфного расширения. Я склонен чувствовать, что это подразумевает много недоверия к тому, кто еще работает с вашим кодом, но, к сожалению, иногда это оправдано.

Ответ 4

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

Если вы хотите применить намерение класса, и намерение таково, что оно не имеет смысла для подкласса, тогда используйте final; в противном случае нет существенных преимуществ.

В целом, это всего лишь механизм для обеспечения намерения.

Ответ 5

Последний класс - это класс, который нельзя подклассифицировать, поэтому все, что вы не хотите создавать производные. Например, в Java класс Math является окончательным, поскольку Java не хочет, чтобы вы могли переопределить то, что означает значение Absolute.

Ответ 6

final (и запечатанный в С#) можно использовать (разработчиками библиотеки классов) для обеспечения некоторого базового поведения класса.
Например, убедитесь, что строка имеет неизменное поведение
Класс string в java отмечен как final, а в С# он отмечен опечатанным.
Все строки неизменяемы и это поведение не может быть изменено.