Flash AS3中的RFC安全枚举



早上好

从一开始,人们就希望并发明了在Flash AS3中进行枚举的方法。

许多尝试都出现了各种问题,例如使用构造函数创建enum的新类型(不安全)的能力。

我相信下面的代码在编译时是类型安全的,并且在运行时不会创建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#编译器允许)作为尝试禁止运行时创建更多枚举值。不过我觉得这个更漂亮。

我们怎么看?

丰富

您可以在构造函数中使用更严格的编译时间限制(以下所有代码都在同一个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
{
}

1)如何将值转换为枚举成员?

2)我看到创建PermissionsEnum的一个问题:没有对其内部值的共同控制。我的意思是,如果枚举中有5-10个成员,找到重复的值是没有问题的。但是如果列表变大,在源代码中出错的几率也会降低:

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);

最新更新