Java 枚举

原文:https://www.studytonight.com/java/enumerations.php

在 JDK5 中,枚举被添加到 Java 语言中。枚举是指命名常量的列表。在 Java 中,枚举定义了一个Class类型。枚举可以有构造器、方法和实例变量。它是使用枚举关键字创建的。每个枚举常量默认为公共静态最终。即使枚举定义了一个Class类型并有构造器,您也不能使用 new 实例化一个枚举。枚举变量的使用和声明方式与原始变量非常相似。


如何定义和使用枚举

  1. 枚举可以简单地通过创建枚举变量列表来定义。让我们举一个主题变量列表的例子,列表中有不同的主题。

    //Enumeration defined
    enum Subject           
    {
        Java, Cpp, C, Dbms
    }
    
  2. 标识符 Java、Cpp、C 和 Dbms 称为枚举常量。默认情况下,这些是公共的、静态的和最终的。

  3. 枚举的变量可以直接定义,不需要任何新的关键字。

枚举示例

让我们创建一个示例来定义枚举,并通过使用枚举引用变量来访问其常量。

enum WeekDays{ 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 
}

class Demo
{
    public static void main(String args[])
    {
        WeekDays wk;             //wk is an enumeration variable of type WeekDays
        wk = WeekDays.SUNDAY;     //wk can be assigned only the constants defined under enum type Weekdays
        System.out.println("Today is "+wk);
    }
}

今天是星期天

使用switch语句的枚举示例

枚举可以在 switch case 中用来创建决策应用,这里我们已经创建了一个可以用来挑选用户选择餐厅的餐厅枚举。

enum Restaurants {
dominos, kfc, pizzahut, paninos, burgerking
}
class Test {
public static void main(String args[])
{
Restaurants r;
r = Restaurants.paninos;
switch(r) { //The name of the enumertion constants are used without their enumeration
type name i.e only r, not Restaurants.r
case dominos: //only constants defined under enum Restaurants can be used
System.out.println("I AM " + r.dominos);
break;
case kfc:
System.out.println("I AM " + r.kfc);
break;
case pizzahut:
System.out.println("I AM " + r.pizzahut);
break;
case paninos:
System.out.println("I AM " + r.paninos);
break;
case burgerking:
System.out.println("I AM " + r.burgerking);
break;
}
}
}

我是帕尼诺斯

示例:If-Else 中的枚举

枚举可以在 if 语句中用来将一个值与一些预定义的常数进行比较。这里我们使用了带有 if else 语句的枚举。

     enum WeekDays{ 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 
}

class Demo {
    public static void main(String args[])
    {
        WeekDays weekDays = WeekDays.WEDNESDAY;

        if(weekDays == WeekDays.SUNDAY || weekDays == WeekDays.SATURDAY)
            System.out.println("It is Weekend");
        else 
            System.out.println("It is weekday: "+weekDays);

    }
}

今天是工作日:星期三

示例:遍历枚举元素

我们可以通过调用枚举元素的静态方法值()来迭代枚举元素。此方法返回所有枚举常数的数组,这些常数还可以使用 for 循环进行迭代。见下面的例子。

     enum WeekDays{ 
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY 
}

class Demo {
    public static void main(String args[])
    {
        WeekDays[] weekDays = WeekDays.values();

        for(WeekDays weekday : weekDays ){

            System.out.println(weekday);

        }    
    }
}

周日周一周二周三周四周五周六

Values()和 ValueOf()方法

所有枚举预定义方法值()值()values()方法返回一个枚举类型的数组,其中包含所有枚举常量。它的一般形式是,

public **static** *enum-type[ ]* **values()**

valueOf()方法用于返回枚举常量,其值等于调用此方法时作为参数传入的字符串。它的一般形式是,

public **static** *enum-type* **valueOf** (String *str*)

使用 values()和 valueOf()方法的枚举示例:

Value 和 valueOf 都是枚举类型的静态方法,可用于访问枚举元素。这里我们使用这两种方法来访问枚举元素。

 enum Restaurants {
    DOMINOS, KFC, PIZZAHUT, PANINOS, BURGERKING
}
class Demo {
    public static void main(String args[])
    {
        Restaurants r;
        System.out.println("All constants of enum type Restaurants are:");
        Restaurants  rArray[] = Restaurants.values(); //returns an array of constants of type Restaurants
        for(Restaurants  a : rArray) //using foreach loop
            System.out.println(a);

        r = Restaurants.valueOf("DOMINOS");
        System.out.println("It is " + r);
    }
}

枚举类型餐厅的所有常量都是:DOMINOS KFC PIZZAHUT PANINOS BURGERKING 它是 DOMINOS

关于枚举需要记住的要点

  1. 枚举属于Class类型,具有 Java 类所具有的所有功能。
  2. 枚举可以有构造器、实例变量、方法,甚至可以实现接口。
  3. 枚举不使用 new 关键字进行实例化。
  4. 默认情况下,所有枚举都继承 java.lang.Enum 类。

带有构造器、实例变量和方法的枚举

枚举类似于类,只是它不能实例化。它可以有方法、构造器、变量等。在这个例子中,我们在 enum 中创建构造器和方法,并使用它们访问其常量值。

enum Student
{
    John(11), Bella(10), Sam(13), Viraaj(9);
    private int age;                   //variable defined in enum Student
    int getage() { return age; }  //method defined in enum Student
    private Student(int age)  //constructor defined in enum Student
    {
        this.age= age;
    }
}
class Demo
{
    public static void main( String args[] )
    {
        Student S;
        System.out.println("Age of Viraaj is " +Student.Viraaj.getage()+ " years");
    }
}

维拉杰的年龄是 9 岁

在这个例子中,只要我们声明一个枚举变量(学生 S ,构造器就被调用一次,它用括号中用它们指定的值初始化每个枚举常数的年龄。