Java枚举示例

时间:2020-02-23 14:37:07  来源:igfitidea点击:

枚举类型是一种特殊的数据类型,它包含不同的常量,如白色、黑色、红色。惯例是它们应该以大写字母命名,因为它们又是常量。在java中,可以使用 enum关键字定义枚举类型。

public enum Macronutrients {
 FATS, CARBOHYDRATES, PROTEIN
}

如果在编译时知道程序的所有可能的常量,那么应该用枚举类型表示它们。

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

其他编程语言,如C++或者C,也有EnUM数据类型,但是在java中,它更强大。例如,在C/C++中,枚举只是一个整数值的列表,而在java中,它本身就是一个扩展枚举的类,一般来说,对读写都比较好。除此之外,由于enum是一个类,它还提供了允许在enum成员上进行迭代的不同方法。

在Java中,还可以使用name()方法,该方法将从枚举数据类型中获取成员值:

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
  }
}

输出

PROTEIN

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
  }
}

输出

NONE

在类内声明的枚举:

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
  }
}

输出

NONE

每个枚举都是类型为enum的object。还记得我说过enum给我们灵活性吗?它也可以作为参数传递给switch语句。

使用switch语句示例

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(); 
  } 
}

输出

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..

需要记住的关键事项:

因为enum是public static final,这意味着可以使用enum Name访问它,但也因为它是final,所以我们不能创建enum的child。

枚举和类之间到底有什么区别?你可能会有这样一个问题,而且是完全正确的!

类与枚举的主要区别

java.land.Enum由枚举扩展,并为其提供人类可读的.toString方法、.name和.ordinal方法等。

枚举可以在switch语句中使用

enum构造函数为我们提供了一些另外的支持方法,如values()、valueOf()等,这些方法被证明是非常有用的;