# Java 枚举示例

> 原文： [https://javatutorial.net/java-enum-example](https://javatutorial.net/java-enum-example)

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

![java-featured-image](img/e0db051dedc1179e7424b6d998a6a772.jpg)

```java
public enum Macronutrients {
   FATS, CARBOHYDRATES, PROTEIN
}
```

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

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

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

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

```java
public class Main {
    public enum Macronutrients {
        FAT, CARBOHYDRATES, PROTEIN;
    }

    public static void main(String[] args) {
        Macronutrients m = Macronutrients.PROTEIN;

        System.out.println(m.name()); // PROTEIN
    }
}
```

**输出**

```java
PROTEIN
```

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

在类之外声明的枚举：

```java
enum Macronutrients {
    FAT, CARBOHYDRATES, PROTEIN, NONE
}

public class Main {

    public static void main(String[] args) {
        Macronutrients m  = Macronutrients.NONE;
        System.out.println(m.name()); // PROTEIN
    }
}
```

**输出**

```java
NONE

```

在类内声明的枚举：

```java
public class Main {
    public enum Macronutrients {
        FAT, CARBOHYDRATES, PROTEIN, NONE
    }
    public static void main(String[] args) {
        Macronutrients m  = Macronutrients.NONE;
        System.out.println(m.name()); // PROTEIN
    }
}
```

**输出**

```java
NONE
```

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

**使用`switch`语句**的示例

```java
enum Macronutrients 
{ 
    FAT, CARBOHYDRATES, PROTEIN, NONE
} 

public class Main 
{ 
    Macronutrients macro; 

    public Main(Macronutrients macro) 
    { 
        this.macro = macro; 
    } 

    public void whichMacro() 
    { 
        switch (macro) 
        { 
        case FAT: 
            System.out.println("You've chosen FAT. A bit unhealthy, if it is the bad type of it."); 
            break; 
        case CARBOHYDRATES: 
            System.out.println("You've chosen CARBOHYDRATES. Let's hope it's not sugars, right?"); 
            break; 
        case PROTEIN: 
            System.out.println("You've chosen PROTEIN. Smart decision."); 
            break; 
        default: 
            System.out.println("You have not chosen anything. You must be starving.."); 
            break; 
        } 
    } 

    public static void main(String[] args) 
    { 
        Macronutrients carbs = Macronutrients.CARBOHYDRATES;
        Macronutrients fats = Macronutrients.FAT;
        Macronutrients protein = Macronutrients.PROTEIN;
        Macronutrients nothing = Macronutrients.NONE;

        Main instance1 = new Main(carbs); 
        instance1.whichMacro(); 

        Main instance2 = new Main(fats); 
        instance2.whichMacro(); 

        Main instance3 = new Main(protein); 
        instance3.whichMacro(); 

        Main instance4 = new Main(nothing); 
        instance4.whichMacro(); 
    } 
}
```

**输出**

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

```

**要记住的关键事项**：

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

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

**类和枚举之间的主要区别**

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