Java 列舉型別
阿新 • • 發佈:2018-12-21
列舉型別
列舉型別是一種特殊的資料型別,它使得變數成為一組預定義的常量。變數必須等於預定義的值之一。常見的示例有羅盤方向與星期。
由於預定值為常量,所以列舉型別的欄位名稱為大寫字母。
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)));
}
}