Есть ли какие-то преимущества при использовании final в AS3? - PullRequest
12 голосов
/ 17 января 2012

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

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

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

Ответы [ 5 ]

11 голосов
/ 17 января 2012

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

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

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

4 голосов
/ 11 марта 2013

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

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

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

2 голосов
/ 17 января 2012

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

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

1 голос
/ 17 января 2012

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

Как это работает?
Для завершения класса:

final public class A
{
    //
}

Для завершения метода:

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

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

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

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

0 голосов
/ 17 января 2012

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

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

- EDIT

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

  1. отрицает полиморфизм

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

  3. нарушает SRP

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...