Когда я должен использовать «финал»?

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

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

12 голосов | спросил Michał Tatarynowicz 8 FebruaryEurope/MoscowbSun, 08 Feb 2009 23:32:59 +0300000000pmSun, 08 Feb 2009 23:32:59 +030009 2009, 23:32:59

6 ответов


0

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

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

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

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

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

ответил Nik Reiman 8 FebruaryEurope/MoscowbSun, 08 Feb 2009 23:35:42 +0300000000pmSun, 08 Feb 2009 23:35:42 +030009 2009, 23:35:42
0

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

ответил Sören Kuklau 8 FebruaryEurope/MoscowbSun, 08 Feb 2009 23:51:50 +0300000000pmSun, 08 Feb 2009 23:51:50 +030009 2009, 23:51:50
0

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

ответил chaos 8 FebruaryEurope/MoscowbSun, 08 Feb 2009 23:36:31 +0300000000pmSun, 08 Feb 2009 23:36:31 +030009 2009, 23:36:31
0

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

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

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

ответил Ryan Emerle 9 FebruaryEurope/MoscowbMon, 09 Feb 2009 00:00:45 +0300000000amMon, 09 Feb 2009 00:00:45 +030009 2009, 00:00:45
0

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

ответил Justin Yost 8 FebruaryEurope/MoscowbSun, 08 Feb 2009 23:37:04 +0300000000pmSun, 08 Feb 2009 23:37:04 +030009 2009, 23:37:04
0

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

ответил Kb. 8 FebruaryEurope/MoscowbSun, 08 Feb 2009 23:49:09 +0300000000pmSun, 08 Feb 2009 23:49:09 +030009 2009, 23:49:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132