1. 程式人生 > >Java™ 教程(列舉型別)

Java™ 教程(列舉型別)

列舉型別

列舉型別是一種特殊的資料型別,它使變數成為一組預定義的常量,變數必須等於為其預定義的值之一,常見示例包括羅盤方向(NORTHSOUTHEASTWEST的值)和星期。

因為它們是常量,所以列舉型別欄位的名稱是大寫字母。

在Java程式語言中,你可以使用enum關鍵字定義列舉型別,例如,你可以將星期的列舉型別指定為:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY 
}

你應該在需要表示一組固定常量時使用列舉型別,這包括自然列舉型別,例如太陽系中的行星和資料集,你可以在編譯時知道所有可能的值 — 例如,選單上的選項、命令列標誌等。

以下是一些程式碼,向你展示如何使用上面定義的Day列舉:

public class EnumTest {
    Day day;
    
    public EnumTest(Day day) {
        this.day = day;
    }
    
    public void tellItLikeItIs() {
        switch (day) {
            case MONDAY:
                System.out.println("Mondays are bad.");
                break;
                    
            case FRIDAY:
                System.out.println("Fridays are better.");
                break;
                         
            case SATURDAY: case SUNDAY:
                System.out.println("Weekends are best.");
                break;
                        
            default:
                System.out.println("Midweek days are so-so.");
                break;
        }
    }
    
    public static void main(String[] args) {
        EnumTest firstDay = new EnumTest(Day.MONDAY);
        firstDay.tellItLikeItIs();
        EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
        thirdDay.tellItLikeItIs();
        EnumTest fifthDay = new EnumTest(Day.FRIDAY);
        fifthDay.tellItLikeItIs();
        EnumTest sixthDay = new EnumTest(Day.SATURDAY);
        sixthDay.tellItLikeItIs();
        EnumTest seventhDay = new EnumTest(Day.SUNDAY);
        seventhDay.tellItLikeItIs();
    }
}

輸出是:

Mondays are bad.
Midweek days are so-so.
Fridays are better.
Weekends are best.
Weekends are best.

Java程式語言列舉型別比其他語言中的對應型別強大得多,列舉宣告定義了一個類(稱為列舉型別),列舉類體可以包括方法和其他欄位,編譯器在建立列舉時會自動新增一些特殊方法。例如,它們有一個靜態值方法,該方法返回一個數組,該陣列按照宣告的順序包含列舉的所有值,此方法通常與for-each構造結合使用,以迭代列舉型別的值。例如,下面Planet類示例中的程式碼遍歷太陽系中的所有行星。

for (Planet p : Planet.values()) {
    System.out.printf("Your weight on %s is %f%n",
                      p, p.surfaceWeight(mass));
}
注意:所有列舉都隱式擴充套件java.lang.Enum,由於類只能擴充套件一個父級(請參閱宣告類),因此Java語言不支援狀態多重繼承(請參閱狀態、實現和型別的多重繼承),因此列舉不能擴充套件其他任何內容。

在以下示例中,Planet是一種列舉型別,表示太陽系中的行星,它們具有恆定的質量和半徑屬性。

每個列舉常量都聲明瞭質量和半徑引數的值,建立常量時,這些值將傳遞給建構函式,Java要求在任何欄位或方法之前首先定義常量,此外,當存在欄位和方法時,列舉常量列表必須以分號結尾。

注意:列舉型別的建構函式必須是包私有或私有訪問,它會自動建立在列舉體開頭定義的常量,你不能自己呼叫​​列舉建構函式。

除了它的屬性和建構函式之外,Planet還有一些方法可以讓你檢索每個行星上物體的表面重力和重量,這是一個示例程式,它可以將你的重量放在地球上(在任何單位)並計算和列印在所有行星上的重量(在同一單位):

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    private double mass() { return mass; }
    private double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: java Planet <earth_weight>");
            System.exit(-1);
        }
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }
}

如果從命令列執行Planet.class,引數為175,則會得到以下輸出:

$ java Planet 175
Your weight on MERCURY is 66.107583
Your weight on VENUS is 158.374842
Your weight on EARTH is 175.000000
Your weight on MARS is 66.279007
Your weight on JUPITER is 442.847567
Your weight on SATURN is 186.552719
Your weight on URANUS is 158.397260
Your weight on NEPTUNE is 199.207413