Java枚举类型enum的详解及使用

  

Java枚举类型enum的详解及使用

什么是枚举类型enum

Java中的枚举类型enum定义一个类,列出该类的所有实例,这些实例的值是有限的、预定义的。

是一组有名字的值的集合,它们常被用作程序中的常量或者可选择的值。

Java的枚举(enum)是一种比传统的常量更为灵活、可扩展的类型。

枚举类型enum的使用

枚举的定义

enum可以在类或者包的内部定义。

定义枚举时,第一行列出枚举的所有元素。每个枚举都是以逗号分隔的名称列表结束。在此之后,您可以将任何普通字段或方法添加到枚举中。

下面的例子定义了车型enum

public enum CarModel {
   SEDAN, COUPE, WAGON, SPORTS, SUV
}

枚举的使用

当定义枚举类型时,编译器会自动为我们创建一个含有我们预定义了的常量的类,并为它们赋上值。我们可以通过枚举类型的名称来访问这些常量。

CarModel sports = CarModel.SPORTS;

枚举的遍历

Java支持对枚举类型进行遍历。从Java 5开始,我们可以使用枚举的静态方法values()返回一个包含所有枚举值的数组,然后使用for-each循环来遍历这个数组。

for (CarModel cm : CarModel.values()) {
   System.out.println(cm);
}

枚举的方法

在枚举中,你也可以定义方法。

public enum CarModel {
   SEDAN(4), COUPE(2), WAGON(4), SPORTS(2), SUV(4);

   private final int numWheels; 

   private CarModel(int numWheels) {
       this.numWheels = numWheels;
   }

   public int getNumWheels() { 
       return numWheels; 
   }
}

上面的例子中,我们为每个枚举定义了一个numWheels,并且定义了一个返回numWheels的方法。

示例

下面通过两个示例,进一步说明枚举类型的使用。

示例一:计算器

public class Calculator {
    enum Operator {
        ADD, SUBTRACT, MULTIPLY, DIVIDE
    }

    static int calculate(int a, int b, Operator op) {
        switch (op) {
            case ADD:
                return a + b;
            case SUBTRACT:
                return a - b;
            case MULTIPLY:
                return a * b;
            case DIVIDE:
                return a / b;
            default:
                throw new AssertionError("Unknown operator: " + op);
        }
    }

    public static void main(String[] args) {
        int a = 10, b = 5;

        System.out.println(a + " + " + b + " = " + calculate(a, b, Operator.ADD));
        System.out.println(a + " - " + b + " = " + calculate(a, b, Operator.SUBTRACT));
        System.out.println(a + " * " + b + " = " + calculate(a, b, Operator.MULTIPLY));
        System.out.println(a + " / " + b + " = " + calculate(a, b, Operator.DIVIDE));
    }
}

在这个示例中,我们使用枚举类型Operator。我们定义了四种运算符:ADDSUBTRACTMULTIPLYDIVIDE。在calculate()方法中,我们使用了switch语句,根据操作符来计算两个数字。

示例二:季节

public class Season {
    enum SeasonName {
        SPRING, SUMMER, FALL, WINTER
    }

    static String getSeasonDescription(SeasonName seasonName) {
        switch (seasonName) {
            case SPRING:
                return "The weather is getting warmer.";
            case SUMMER:
                return "The weather is hot.";
            case FALL:
                return "The leaves are changing color.";
            case WINTER:
                return "The weather is cold and it may snow.";
            default:
                throw new AssertionError("Unknown season name: " + seasonName);
        }
    }

    public static void main(String[] args) {
        SeasonName[] seasons = SeasonName.values();

        for (SeasonName season : seasons) {
            System.out.println(season + ": " + getSeasonDescription(season));
        }
    }
}

在这个示例中,我们使用枚举类型SeasonName。我们定义了四个季节:SPRINGSUMMERFALLWINTER。在getSeasonDescription()方法中,我们根据季节来返回一个字符串,简要描述该季节所代表的天气特点。

main()方法中,我们使用for循环来遍历所有季节,并且输出它们的名称和描述。

结论

枚举类型enum是一种非常方便、易于使用、可扩展的类型。在Java 5之后,它成为了Java程序员的标配。在开发程序时,尽量使用枚举类型,可以极大地提高程序的可读性和可维护性。

相关文章