原文: https://javatutorial.net/java-enum-example

    枚举类型是一种特殊的数据类型,它具有不同的常量,例如WHITEBLACKRED。 约定是,它们应以大写字母命名,因为它们又是常量。 在 Java 中,您可以使用enum关键字定义枚举类型。

    Java 枚举示例 - 图1

    1. public enum Macronutrients {
    2. FATS, CARBOHYDRATES, PROTEIN
    3. }

    如果您知道编译时程序的所有可能常量,则应以枚举类型表示它们。

    Java 在 1.5 中引入了 enum 数据类型。

    其他编程语言(例如 C++ 甚至 C)也具有枚举数据类型,但是在 Java 中,它更强大。 例如,在 C/C++ 中,枚举只是整数值的列表,而在 Java 中,它是扩展Enum的类本身,并且通常对读取和写入都更好。 最重要的是,由于枚举是一个类的事实,它还提供了允许在枚举成员上进行迭代的不同方法。

    在 Java 中,您还可以使用name()方法,该方法将为您提供枚举数据类型的成员值:

    1. public class Main {
    2. public enum Macronutrients {
    3. FAT, CARBOHYDRATES, PROTEIN;
    4. }
    5. public static void main(String[] args) {
    6. Macronutrients m = Macronutrients.PROTEIN;
    7. System.out.println(m.name()); // PROTEIN
    8. }
    9. }

    输出

    1. PROTEIN

    Java 中的枚举还为我们提供了灵活性–可以在类内部或外部声明它们。

    在类之外声明的枚举:

    1. enum Macronutrients {
    2. FAT, CARBOHYDRATES, PROTEIN, NONE
    3. }
    4. public class Main {
    5. public static void main(String[] args) {
    6. Macronutrients m = Macronutrients.NONE;
    7. System.out.println(m.name()); // PROTEIN
    8. }
    9. }

    输出

    1. NONE

    在类内声明的枚举:

    1. public class Main {
    2. public enum Macronutrients {
    3. FAT, CARBOHYDRATES, PROTEIN, NONE
    4. }
    5. public static void main(String[] args) {
    6. Macronutrients m = Macronutrients.NONE;
    7. System.out.println(m.name()); // PROTEIN
    8. }
    9. }

    输出

    1. NONE

    每个枚举都是枚举类型的对象。 还记得我说的枚举赋予我们灵活性吗? 好吧,它也可以作为参数传递给switch语句。

    使用switch语句的示例

    1. enum Macronutrients
    2. {
    3. FAT, CARBOHYDRATES, PROTEIN, NONE
    4. }
    5. public class Main
    6. {
    7. Macronutrients macro;
    8. public Main(Macronutrients macro)
    9. {
    10. this.macro = macro;
    11. }
    12. public void whichMacro()
    13. {
    14. switch (macro)
    15. {
    16. case FAT:
    17. System.out.println("You've chosen FAT. A bit unhealthy, if it is the bad type of it.");
    18. break;
    19. case CARBOHYDRATES:
    20. System.out.println("You've chosen CARBOHYDRATES. Let's hope it's not sugars, right?");
    21. break;
    22. case PROTEIN:
    23. System.out.println("You've chosen PROTEIN. Smart decision.");
    24. break;
    25. default:
    26. System.out.println("You have not chosen anything. You must be starving..");
    27. break;
    28. }
    29. }
    30. public static void main(String[] args)
    31. {
    32. Macronutrients carbs = Macronutrients.CARBOHYDRATES;
    33. Macronutrients fats = Macronutrients.FAT;
    34. Macronutrients protein = Macronutrients.PROTEIN;
    35. Macronutrients nothing = Macronutrients.NONE;
    36. Main instance1 = new Main(carbs);
    37. instance1.whichMacro();
    38. Main instance2 = new Main(fats);
    39. instance2.whichMacro();
    40. Main instance3 = new Main(protein);
    41. instance3.whichMacro();
    42. Main instance4 = new Main(nothing);
    43. instance4.whichMacro();
    44. }
    45. }

    输出

    1. You've chosen CARBOHYDRATES. Let's hope it's not sugars, right?
    2. You've chosen FAT. A bit unhealthy, if it is the bad type of it.
    3. You've chosen PROTEIN. Smart decision.
    4. You have not chosen anything. You must be starving..

    要记住的关键事项

    • 由于枚举是公共静态最终,这意味着可以使用枚举名称来访问它,而且由于它是最终的,因此我们无法创建该枚举的子代。

    类和枚举之间到底有什么区别? 这是您可能会遇到的一个问题,它将是完全有效的!

    类和枚举之间的主要区别

    • 枚举扩展了java.land.Enum,并为它提供了人类可读的.toString方法,.name.ordinal方法等。
    • 枚举可用于switch语句
    • 枚举构造函数为我们提供了一些额外的支持方法,例如values()valueOf()等,这些方法被证明确实有用。