类的枚举

“枚举”是您创建的一些自定义数据类型,用于封装一小组值。ActionScript 3.0 并不支持具体的枚举工具,这与 C++ 使用 enum 关键字或 Java 使用 Enumeration 接口不一样。不过,您可以使用类或静态常量创建枚举。例如,ActionScript 3.0 中的 PrintJob 类使用名为 PrintJobOrientation 的枚举来存储由 "landscape""portrait" 组成的一组值,如下面的代码所示:

public final class PrintJobOrientation 
{ 
    public static const LANDSCAPE:String = "landscape"; 
    public static const PORTRAIT:String = "portrait"; 
}

按照惯例,枚举类是使用 final 属性声明的,因为不需要扩展该类。该类仅由静态成员组成,这表示不创建该类的实例。而是直接通过类对象来访问枚举值,如以下代码摘录中所示:

var pj:PrintJob = new PrintJob(); 
if(pj.start()) 
{ 
    if (pj.orientation == PrintJobOrientation.PORTRAIT) 
    { 
        ... 
    } 
    ... 
}

ActionScript 3.0 中的所有枚举类都只包含 String、int 或 uint 类型的变量。使用枚举而不使用文本字符串或数字值的好处是,使用枚举更易于发现字面错误。如果枚举名输入错误,ActionScript 编译器会生成一个错误。如果使用字面值,存在拼写错误或使用了错误数字时,编译器并不会报错。在上一个示例中,如果枚举常量的名称不正确,编译器会生成错误,如以下代码摘录中所示:

    if (pj.orientation == PrintJobOrientation.PORTRAI) // compiler error

但是,如果拼错了字符串字面值,编译器并不生成错误,如下所示:

    if (pj.orientation == "portrai") // no compiler error

创建枚举的第二种方法还包括使用枚举的静态属性创建单独的类。这种方法的不同之处在于每一个静态属性都包含一个类实例,而不是字符串或整数值。例如,以下代码为一星期中的各天创建了一个枚举类:

public final class Day 
{ 
    public static const MONDAY:Day = new Day(); 
    public static const TUESDAY:Day = new Day(); 
    public static const WEDNESDAY:Day = new Day(); 
    public static const THURSDAY:Day = new Day(); 
    public static const FRIDAY:Day = new Day(); 
    public static const SATURDAY:Day = new Day(); 
    public static const SUNDAY:Day = new Day(); 
}

ActionScript 3.0 并不使用这种方法,但是许多开发人员都使用,他们更喜欢使用这种方法提供的改进类型检查功能。例如,返回枚举值的方法可将返回值限定为枚举数据类型。以下代码不但显示了返回星期中各天的函数,还显示了将枚举类型用作类型注释的函数调用:

function getDay():Day 
{ 
    var date:Date = new Date(); 
    var retDay:Day; 
    switch (date.day) 
    { 
        case 0: 
            retDay = Day.MONDAY; 
            break; 
        case 1: 
            retDay = Day.TUESDAY; 
            break; 
        case 2: 
            retDay = Day.WEDNESDAY; 
            break; 
        case 3: 
            retDay = Day.THURSDAY; 
            break; 
        case 4: 
            retDay = Day.FRIDAY; 
            break; 
        case 5: 
            retDay = Day.SATURDAY; 
            break; 
        case 6: 
            retDay = Day.SUNDAY; 
            break; 
    } 
    return retDay; 
} 
 
var dayOfWeek:Day = getDay();

您还可以增强 Day 类的功能,以使其将一个整数与星期中的各天关联,并提供一个 toString() 方法来返回各天的字符串表示形式。您可能希望实践一下,采用这种方法来增强 Day 类的功能。