RFC - безопасный enum во Flash AS3 - PullRequest
1 голос
/ 08 августа 2011

Утро всем

С незапамятных времен человек хотел и изобрел способы выполнения перечислений во Flash AS3.

Было много проблем со многими попытками, такими как возможность использовать конструктор для создания новых типов перечисления (небезопасно).

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

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

package
{
    public class PermissionsEnum
    {

        private static const ENFORCER = new Object();

        public static const READ:PermissionsEnum = new PermissionsEnum(ENFORCER, 1);
        public static const WRITE:PermissionsEnum = new PermissionsEnum(ENFORCER, 2);
        public static const CREATE:PermissionsEnum = new PermissionsEnum(ENFORCER, 4);
        public static const DELETE:PermissionsEnum = new PermissionsEnum(ENFORCER, 8);

        private var _value:uint;

        public function PermissionsEnum(e:Object, v:uint)
        {
            if (e != ENFORCER)
                throw new Error("Attempted enum security breach.");

            this._value = v;
        }

        public function get value() : uint
        {
            return this._value;
        }

    }

}

Комментирует кто-нибудь?

Другие предыдущие попытки позволили использовать некую циркулярную ссылку (что, впрочем, запрещает компилятор Java, а компилятор C #) как попытку запретить создание во время выполнения большего количества значений перечисления. Я думаю, что это более красиво, хотя.

Что мы думаем?

Rich

Ответы [ 2 ]

0 голосов
/ 08 августа 2011

1) Как насчет преобразования значений в члены перечисления?

2) Я вижу одну проблему при создании PermissionsEnum: нет общего контроля над его внутренним значением.Я имею в виду, если у меня есть 5-10 членов в enum, нет проблем найти дублированные значения.Но если список увеличивается, шанс сделать ошибку в исходном дроу тоже:

public static const READ:PermissionsEnum = new PermissionsEnum(ENFORCER, 1);
public static const WRITE:PermissionsEnum = new PermissionsEnum(ENFORCER, 7);
public static const APPEND:PermissionsEnum = new PermissionsEnum(ENFORCER, 15);
public static const CREATE:PermissionsEnum = new PermissionsEnum(ENFORCER, 8);
public static const DELETE:PermissionsEnum = new PermissionsEnum(ENFORCER, 3);
public static const COMMIT:PermissionsEnum = new PermissionsEnum(ENFORCER, 6);
public static const SUBMIT:PermissionsEnum = new PermissionsEnum(ENFORCER, 21);
public static const POP:PermissionsEnum = new PermissionsEnum(ENFORCER, 22);
public static const PUSH:PermissionsEnum = new PermissionsEnum(ENFORCER, 3);
public static const SELECT:PermissionsEnum = new PermissionsEnum(ENFORCER, 17);
public static const DESELECT:PermissionsEnum = new PermissionsEnum(ENFORCER, 22);
public static const END:PermissionsEnum = new PermissionsEnum(ENFORCER, 15);
0 голосов
/ 08 августа 2011

Вы можете использовать более строгие ограничения времени компиляции в конструкторе (весь следующий код находится в одном файле PermissionsEnum.as):

package
{
public class PermissionsEnum
{

    private static const ENFORCER:Enforcer = new Enforcer();

    public static const READ:PermissionsEnum = new PermissionsEnum(ENFORCER, 1);
    public static const WRITE:PermissionsEnum = new PermissionsEnum(ENFORCER, 2);
    public static const CREATE:PermissionsEnum = new PermissionsEnum(ENFORCER, 4);
    public static const DELETE:PermissionsEnum = new PermissionsEnum(ENFORCER, 8);

    private var _value:uint;

    public function PermissionsEnum(e:Enforcer, v:uint)
    {
        this._value = v;
    }

    public function get value() : uint
    {
        return this._value;
    }

}
}

class Enforcer
{
}
...