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

Существуют ли какие-либо преимущества при использовании final в AS3?

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

Я сделал это исключительно потому, что мне нравится поддерживать строгий и сжатый стиль кодирования.

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

4b9b3361

Ответ 1

В соответствии с этот расширенный тест ключевое слово final не делает ни малейшего различия в производительности.

Способ final используется в ActionScript, это неудивительно: последнее ключевое слово обозначает только классы и методы класса и, следовательно, влияет только на наследование. Я не вижу логической причины, по которой вызов окончательного метода должен быть быстрее, чем вызов любого другого метода: для среды выполнения все равно потребуется найти указатель на функцию и выполнить вызов. То же самое относится к методам и классам в Java. Однако в Java final также отмечает ссылки как неизменные. И это большое преимущество перед его использованием в ActionScript, поскольку оно позволяет компилятору "встроить" значения (т.е. заменить все ссылки на переменную в байтовом коде с ее фактическим значением, исключая процедуры поиска), которые - среди других преимуществ - может немного ускорить работу. Возможно, мы увидим некоторое использование этого в будущей версии ActionScript - это было бы хорошей идеей для лучшей четкости кода и предотвращения побочных эффектов.

И по этим причинам я по-прежнему считаю хорошей практикой использовать final, даже если вы не работаете с другими программистами, в случаях , где предполагаемое поведение требует, чтобы методы или классы запрещали переопределения: Он уточняет намерение и предотвращает нежелательные эффекты. Это, следовательно, ускорит развитие, и это не так уж плохо, либо;)

Ответ 2

Важное обновление через год после этого -

ActionScript Compiler 2.0 добавила поддержку функции вложения при определенных условиях, одна из которых заключается в том, что функция static или final. См.: http://www.bytearray.org/?p=4789

Обратите внимание, что если вы собираетесь использовать inlining, вы должны украсить свои функции тегом метаданных [inline] и использовать аргумент компилятора -inline.

Ответ 3

Я не видел никаких доказательств, ни на google, ни на опыте, что классы или методы final работают быстрее, чем не конечные, и даже если они это сделают, разница будет незначительной.

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

Ответ 4

Чтобы предотвратить расширение класса или переопределение метода, мы предшествуем этому определению класса или метода с последним атрибутом.

Как это работает?
Заключить класс:

final public class A
{
    //
}

Завершить метод:

public class A     
{
    final public function A
    {
        //
    }
}

Последний атрибут используется по двум причинам в ActionScript:

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

Методы, которые являются окончательной помощью, скрывают внутренние детали классов. Создание класса или окончательного метода не позволяет другим программистам расширять класс или переопределять метод с целью изучения внутренней структуры классов. Такая профилактика считается одним из способов защиты приложения от злонамеренной эксплуатации.

Ответ 5

Final редко используется и с разумом. Однако иногда рекомендуется использовать его. Как сказано другими, это может предотвратить расширение класса и/или переопределение метода. Вот несколько ответов на использование Final, но все они сосредоточены на аспектах безопасности: Как не удалось использовать "окончательный" проблема безопасности?

По моему опыту, единственными действительно полезными примерами использования Final являются создание публичной библиотеки, и вы специально хотите предотвратить переопределение определенных методов и/или расширение классов. Однако это не имеет ничего общего с безопасностью, но с инкапсуляцией поведения. Это немного сложно представить реальные примеры, но проще всего, например, в одиночных играх. Если вы создали класс, который должен быть доступен как одноэлементный, это не имеет смысла (я знаю, что люди делают это, но они действительно не должны), чтобы позволить пользователю вашего класса расширять этот класс. А также, это приведет их в мир боли. Маркировка класса как Final определенно подходит в этом случае.

- EDIT

отказ от ответственности: я действительно хотел бы отказать в использовании шаблона singleton по различным причинам:

  • он отрицает полиморфизм

  • он запрещает наследование

  • он нарушает SRP

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