1. 程式人生 > >Java 列舉型別

Java 列舉型別

列舉型別

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

由於預定值為常量,所以列舉型別的欄位名稱為大寫字母。
Java中,使用enum關鍵字定義列舉型別。

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

當需要表示固定常量集時,應當使用列舉型別。這包括自然列舉型別(例如太陽系中行星)與在編譯時可知所有可能值的資料集(例如選單中的選項,命令列標識等)。

程式設計中使用列舉型別

public class
EnumLearn { Day day; public EnumLearn(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) { EnumLearn firstDay = new EnumLearn(Day.MONDAY); firstDay.tellItLikeItIs
(); EnumLearn thirdDay = new EnumLearn(Day.WEDNESDAY); thirdDay.tellItLikeItIs(); EnumLearn fifthDay = new EnumLearn(Day.FRIDAY); fifthDay.tellItLikeItIs(); EnumLearn sixthDay = new EnumLearn(Day.SATURDAY); sixthDay.tellItLikeItIs(); EnumLearn seventhDay = new EnumLearn(Day.SUNDAY); seventhDay.tellItLikeItIs(); } }

enum宣告定義了一個類(稱為列舉型別)。列舉類的正文可以包含方法與其他欄位。當建立一個列舉時,編譯器會自動新增一些特定的方法。例如,靜態方法values返回一個數組,此陣列包含列舉中宣告的所有成員,並且按序返回。此方法一般與for-each結構一起使用,用於迭代列舉型別中的所有值。

注意:所有的列舉隱式繼承java.lang.Enum。因為類只能繼承一個雙親,Java語言不支援多重繼承,所以列舉不能繼承任何類。

java要求列舉型別中,常量要首先宣告,先於方法與域。而且,當存在方法與域時,列舉常量列表必需以分號結尾。

注意:列舉型別的構造器必須為包私有或私有。它會自動建立在列舉正文開始位置定義的常量。不能手動呼叫列舉的構造器。

import java.util.*;

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;
  private final double radius;
  Planet(double mass, double radius) {
    this.mass = mass;
    this.radius = radius;
  }

  private double mass() { return mass; }
  private double radius() { return radius; }
  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();
    Arrays.asList(Planet.values()).stream().forEach(p -> System.out.printf("%s %s%n", p, p.surfaceWeight(mass)));
  }

}