Почему Вы сделали бы целый класс изолированным/окончательным?

Я понимаю мотивацию для того, чтобы сделать отдельные методы класса sealed/final, но какая цель делает полностью запрещающее наследование от подачи класса? В то время как разрешение переопределения определенных методов может вызвать плохие вещи произойти, я не вижу, как разрешение наследования от Вашего класса просто для добавления поведения к нему, не переопределяя существующее поведение могло когда-либо быть плохой вещью. Если Вы действительно хотите запретить переопределение чего-нибудь в Вашем классе, почему не только делают каждый финал метода, но и все еще позволяют наследование в целях добавляющего поведения?

9
задан dsimcha 30 January 2010 в 22:16
поделиться

5 ответов

Команда разработчиков организации/программного обеспечения, возможно, захочет внедрить определенные стандарты кодирования. Например, для улучшения читабельности, они могут захотеть, чтобы атрибут X класса Y был изменен только методом Z и больше ничего. Если бы класс не был окончательным, какой-нибудь разработчик мог бы расширить класс Y и добавить метод W, который мог бы модифицировать X по-другому и вызвать путаницу и задержку в понимании написанного кода.

3
ответ дан 4 December 2019 в 19:33
поделиться

Есть несколько хороших дискуссий об этом в «Почему строку финала в Java»: Почему класс String заявлен финал в Java?

Основное резюме в этом случае, строка неизменяется, а также Если он может быть подклассно, подкласс может сделать его смешным.

4
ответ дан 4 December 2019 в 19:33
поделиться

Я думаю, что это зависит.

Если у меня есть внутреннее приложение, я бы не использовал финал на уровне класса по умолчанию. Код просто становится слишком загроможденным. В некоторых обстоятельствах окончательный модификатор даже действительно раздражает, если я хочу безопасно рефакторировать (см. Программирование разнице срок). В некоторых случаях «по умолчанию-финальной мани» сделало большие проблемы, когда я пытался ревертировать.

С другой стороны, если я проектирую API / Framework, где код больше, приводимый к расширению, я бы использовал окончательный для классов более агрессивно ». Здесь неправильное расширение может быть большой проблемой, а «окончательный» модификатор является безопасным способом избежать таких ошибок программирования.

Но я просто против, чтобы сказать «Final» по умолчанию, например, многие делают. Он часто имеет больше недостатков в качестве преимуществ. Для меня по умолчанию должны быть «разумные и более распространенные настройки».

0
ответ дан 4 December 2019 в 19:33
поделиться

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

3
ответ дан 4 December 2019 в 19:33
поделиться

Это можно сделать с помощью комбинации array _ search () и array _ splice () .

Не проверено, но должно работать для массивов , содержащих значение только один раз:

$array = array("Apples", "strawberries", "pears");
$searchpos = array_search("strawberries", $array);
if ($searchpos !== FALSE) {
  array_splice($array, $searchpos, 1);
}
-121--3033240-

Имеется ли файл тэгов для проекта, над которым вы работаете? Если не попытаться создать один с exuberant-ctags и Vim должен забрать его с taglist pluglin.

-121--949860-

Подумайте об этом так: Вы потратили последние 3 месяца, работая над базовым классом для вашей собственной структуры, которую другие собираются использовать, и вся согласованность рамки основана на коде, написанном в этом классе, изменение этого класса может привести к ошибкам, ошибкам и неправильному поведению рамки, Как вы мешаете вашим великим программистам расширять его и переопределять один из его методов?

В дополнение к этому есть классы, которые должны быть неизменными, такие как java.lang. Последовательность класс в Java, расширение его и изменение его поведения может создать большой беспорядок!

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

2
ответ дан 4 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

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