Flex Enumerator Class
Monday, January 25th, 2010This is my take on creating an Enumerator class in Flex.
AS3 does not support Enumerators so a class with static constants is used as per the Java Enumerator class pattern.
This implementation is type safe and final. It also contains static helper functions; values() which returns an array of the Enumerator objects (useful for iterations) and getByValue() which allows for easy retrieval of a typed Enumerator object from its primitive value.
package{import flash.errors.IllegalOperationError;import flash.utils.Dictionary;import flash.utils.describeType;/**
* Example Enumerator Representing different RGB Colors*/public final class ColorEnum{/* PUBLIC */public static var RED:ColorEnum = new ColorEnum('RED', PrivateEnforcer);public static var GREEN:ColorEnum = new ColorEnum('GREEN', PrivateEnforcer);public static var BLUE:ColorEnum = new ColorEnum('BLUE', PrivateEnforcer);/**
* Constructor*/public function ColorEnum(value:String, privateEnforcer:Class){// Force private call onlyif (privateEnforcer != PrivateEnforcer){throw new IllegalOperationError("Invalid constructor access");}// Add Enum valuethis._value = value;}/**
* Get all Enumerator Values*/public static function values():Array{/* LOCALS */var values:Array = new Array();var value:ColorEnum = null;if (ColorEnum._values == null)ColorEnum.buildValues();for each (value in ColorEnum._values)values.push(value);return values;}/**
* Get an Enumerator instance by its primative value*/public static function getByValue(value:String):ColorEnum{if (ColorEnum._values == null)ColorEnum.buildValues();return ColorEnum._values[value] as ColorEnum;}/**
* override value*/public function valueOf():Object{return this._value;}/**
* override toString*/public function toString():String{return this._value;}/* PRIVATE */private var _value:String = '';private static var _values:Dictionary = null;/**
* Build static dictionary of all Enum consts and values*/private static function buildValues():void{/* LOCALS */var metaData:XML = describeType(VehicleTypeEnum);var node:XML = null;// Create values DictionaryColorEnum._values = new Dictionary();// Add Each Enum const and valuefor each (node in metaData.children()){if (node.name() == 'variable' && node.@type == metaData.@name)ColorEnum._values[ColorEnum[node.@name].toString()] = ColorEnum[node.@name];}}}}class PrivateEnforcer {}- Download this code: ColorEnum.as.txt
