早上好
从一开始,人们就希望并发明了在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);