Я понимаю мотивацию для того, чтобы сделать отдельные методы класса sealed
/final
, но какая цель делает полностью запрещающее наследование от подачи класса? В то время как разрешение переопределения определенных методов может вызвать плохие вещи произойти, я не вижу, как разрешение наследования от Вашего класса просто для добавления поведения к нему, не переопределяя существующее поведение могло когда-либо быть плохой вещью. Если Вы действительно хотите запретить переопределение чего-нибудь в Вашем классе, почему не только делают каждый финал метода, но и все еще позволяют наследование в целях добавляющего поведения?
Команда разработчиков организации/программного обеспечения, возможно, захочет внедрить определенные стандарты кодирования. Например, для улучшения читабельности, они могут захотеть, чтобы атрибут X класса Y был изменен только методом Z и больше ничего. Если бы класс не был окончательным, какой-нибудь разработчик мог бы расширить класс Y и добавить метод W, который мог бы модифицировать X по-другому и вызвать путаницу и задержку в понимании написанного кода.
Есть несколько хороших дискуссий об этом в «Почему строку финала в Java»: Почему класс String заявлен финал в Java?
Основное резюме в этом случае, строка неизменяется, а также Если он может быть подклассно, подкласс может сделать его смешным.
Я думаю, что это зависит.
Если у меня есть внутреннее приложение, я бы не использовал финал на уровне класса по умолчанию. Код просто становится слишком загроможденным. В некоторых обстоятельствах окончательный модификатор даже действительно раздражает, если я хочу безопасно рефакторировать (см. Программирование разнице срок). В некоторых случаях «по умолчанию-финальной мани» сделало большие проблемы, когда я пытался ревертировать.
С другой стороны, если я проектирую API / Framework, где код больше, приводимый к расширению, я бы использовал окончательный для классов более агрессивно ». Здесь неправильное расширение может быть большой проблемой, а «окончательный» модификатор является безопасным способом избежать таких ошибок программирования.
Но я просто против, чтобы сказать «Final» по умолчанию, например, многие делают. Он часто имеет больше недостатков в качестве преимуществ. Для меня по умолчанию должны быть «разумные и более распространенные настройки».
В общем, класс можно сделать окончательным, чтобы сохранить инварианты, которые заставляют его работать. Я настоятельно рекомендую "Эффективную Яву" Джошуа Блоха для отличного обсуждения этого и связанных с ним вопросов.
Это можно сделать с помощью комбинации 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, расширение его и изменение его поведения может создать большой беспорядок!
Наконец, иногда установка класса или метода в качестве окончательного повысит производительность, но я никогда не тестировал его, и не вижу причин делать класс/метод окончательным для очень крошечного увеличения производительности, которое равно нулю по сравнению со временем, необходимым для выполнения других вещей в программе.