Flex Enumerator Class

This 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.

  1.  
  2. package
  3. {
  4. import flash.errors.IllegalOperationError;
  5. import flash.utils.Dictionary;
  6. import flash.utils.describeType;
  7.  
  8. /**
  9. * Example Enumerator Representing different RGB Colors
  10. */
  11. public final class ColorEnum
  12. {
  13. /* PUBLIC */
  14.  
  15. public static var RED:ColorEnum = new ColorEnum('RED', PrivateEnforcer);
  16. public static var GREEN:ColorEnum = new ColorEnum('GREEN', PrivateEnforcer);
  17. public static var BLUE:ColorEnum = new ColorEnum('BLUE', PrivateEnforcer);
  18.  
  19.  
  20. /**
  21. * Constructor
  22. */
  23. public function ColorEnum(value:String, privateEnforcer:Class)
  24. {
  25. // Force private call only
  26. if (privateEnforcer != PrivateEnforcer)
  27. {
  28. throw new IllegalOperationError("Invalid constructor access");
  29. }
  30.  
  31. // Add Enum value
  32. this._value = value;
  33. }
  34.  
  35.  
  36. /**
  37. * Get all Enumerator Values
  38. */
  39. public static function values():Array
  40. {
  41. /* LOCALS */
  42. var values:Array = new Array();
  43. var value:ColorEnum = null;
  44.  
  45. if (ColorEnum._values == null)
  46. ColorEnum.buildValues();
  47.  
  48. for each (value in ColorEnum._values)
  49. values.push(value);
  50.  
  51. return values;
  52. }
  53.  
  54.  
  55. /**
  56. * Get an Enumerator instance by its primative value
  57. */
  58. public static function getByValue(value:String):ColorEnum
  59. {
  60. if (ColorEnum._values == null)
  61. ColorEnum.buildValues();
  62.  
  63. return ColorEnum._values[value] as ColorEnum;
  64. }
  65.  
  66.  
  67. /**
  68. * override value
  69. */
  70. public function valueOf():Object
  71. {
  72. return this._value;
  73. }
  74.  
  75.  
  76. /**
  77. * override toString
  78. */
  79. public function toString():String
  80. {
  81. return this._value;
  82. }
  83.  
  84.  
  85.  
  86. /* PRIVATE */
  87.  
  88. private var _value:String = '';
  89.  
  90. private static var _values:Dictionary = null;
  91.  
  92.  
  93. /**
  94. * Build static dictionary of all Enum consts and values
  95. */
  96. private static function buildValues():void
  97. {
  98. /* LOCALS */
  99. var metaData:XML = describeType(VehicleTypeEnum);
  100. var node:XML = null;
  101.  
  102. // Create values Dictionary
  103. ColorEnum._values = new Dictionary();
  104.  
  105. // Add Each Enum const and value
  106. for each (node in metaData.children())
  107. {
  108. if (node.name() == 'variable' && node.@type == metaData.@name)
  109. ColorEnum._values[ColorEnum[node.@name].toString()] = ColorEnum[node.@name];
  110. }
  111.  
  112. }
  113. }
  114. }
  115.  
  116. class PrivateEnforcer {}

One Response to “Flex Enumerator Class”

  1. Roland Zwaga Says:

    Here’s another approach (learnt from the Java world) we use a lot in the Spring Actionscript sources:

    https://src.springframework.org/svn/se-springactionscript-as/trunk/spring-actionscript-core/src/main/actionscript/org/springextensions/actionscript/ioc/ObjectDefinitionScope.as


Leave a Reply

Copyright © 2005, David Beale

  • Valid XHTML 1.0!
  • Valid CSS
  • Level Triple-A conformance icon, W3C-WAI Web Content Accessibility Guidelines 1.0