クラスによる列挙

"列挙"は、値の小さなセットをカプセル化するために作成するカスタムデータ型です。ActionScript 3.0 は、C++ の enum キーワードや Java の Enumeration インターフェイスとは異なり、特定の列挙機能をサポートしません。ただし、クラスと静的定数を使用して列挙を作成できます。たとえば、次のコードに示すように、Flash Player API の 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)
    {
        ...
    }
    ...
}

Flash Player API のすべての列挙クラスには、String 型、int 型、uint 型の変数のみが含まれます。リテラルのストリング値または数値ではなく列挙を使用する利点は、表記ミスを見つけやすいことです。列挙の名前を間違って入力した場合、ActionScript コンパイラはエラーを生成します。リテラル値を使用した場合、単語を間違って入力するか数値を間違って使用してもコンパイラに認識されません。前の例では、次のコードの抜粋に示すように、列挙定数の名前が間違っている場合にコンパイラはエラーを生成します。

    if(pj.orientation == PrintJobOrientation.PORTRAI) // コンパイルエラー

ただし、次のようにリテラルストリング値にスペルミスがある場合、コンパイラはエラーを生成しません。

    if(pj.orientation == "portrai") // コンパイルエラーなし

列挙を作成するもう 1 つの方法でも、列挙の静的プロパティで別のクラスを作成することが必要になります。ただし、この方法は、静的プロパティにストリング値または整数値ではなくクラスのインスタンスが含まれる点で異なります。たとえば、次のコードは、曜日に対する列挙クラスを作成します。

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

この方法は、Flash Player API によっては使用されませんが、この方法による型チェックの向上を好む多くの開発者が使用しています。たとえば、列挙値を返すメソッドは、その戻り値を列挙データ型に制限することができます。次のコードは、曜日を返す関数だけでなく、列挙型を型注釈として使用する関数呼び出しも示します。

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 クラスの機能拡張を実習として試してみることができます。


Flex 2.01