📜  使用Java枚举

📅  最后修改于: 2020-02-12 14:42:06             🧑  作者: Mango

枚举用于以编程语言表示一组命名常量的目的。例如,在一副扑克牌中的4套可以是名为Club,Diamond,Heart和Spade的4个枚举器,它们属于名为Suit的枚举类型。其他示例包括自然枚举类型(例如行星,星期几,颜色,方向等)。
当我们在编译时知道所有可能的值(例如,菜单上的选择,舍入模式,命令行标志等)时,将使用枚举。枚举类型的常量集不必始终保持固定
在Java(从1.5开始)中,枚举使用枚举数据类型enum表示。Java枚举比C / C++枚举更强大。在Java中,我们还可以向其中添加变量,方法和构造函数。枚举的主要目的是定义我们自己的数据类型(枚举数据类型)。
Java中的枚举声明:

  • 枚举声明可以在类外部或类内部进行,但不能在方法内部进行。
    // 一个使用Java枚举enum的例子
    enum Color
    {
        RED, GREEN, BLUE;
    }
    public class Test
    {
        // 测试代码
        public static void main(String[] args)
        {
            Color c1 = Color.RED;
            System.out.println(c1);
        }
    }

    输出:

    RED
    // enum在类内声明.
    public class Test
    {
        enum Color
        {
            RED, GREEN, BLUE;
        }
        // 测试代码
        public static void main(String[] args)
        {
            Color c1 = Color.RED;
            System.out.println(c1);
        }
    }

    输出:

    RED
  • 枚举内的第一行应该是常量列表,然后是方法、变量和构造函数之类的其他内容。
  • 根据Java命名约定,建议使用所有大写字母命名常量。 

枚举的重点:

  • 每个枚举都通过使用Class在内部实现。
    /* 在enum Color,底层的转换如下:
    class Color
    {
         public static final Color RED = new Color();
         public static final Color BLUE = new Color();
         public static final Color GREEN = new Color();
    }*/
  • 每个枚举常量都代表一个枚举类型的对象
  • 枚举类型可以作为参数传递给switch语句。
    // Java程序,展示枚举对象在switch中的使用
    import Java.util.Scanner;
    // Enum枚举
    enum Day
    {
        SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
        THURSDAY, FRIDAY, SATURDAY;
    }
    //测试代码
    public class Test
    {
        Day day;
        // 构造器
        public Test(Day day)
        {
            this.day = day;
        }
        // 使用switch打印Day
        public void dayIsLike()
        {
            switch (day)
            {
            case MONDAY:
                System.out.println("周一太差劲了.");
                break;
            case FRIDAY:
                System.out.println("周五棒极了.");
                break;
            case SATURDAY:
            case SUNDAY:
                System.out.println("周末最棒.");
                break;
            default:
                System.out.println("周中还行吧.");
                break;
            }
        }
        // Driver method
        public static void main(String[] args)
        {
            String str = "MONDAY";
            Test t1 = new Test(Day.valueOf(str));
            t1.dayIsLike();
        }
    }

    输出:

    周一太差劲了.
  • 每个枚举常量始终是隐式public static final。由于它是静态的,因此我们可以使用enum Name来访问它。由于它是final,因此我们无法创建子枚举。
  • 我们可以在枚举内声明main()方法。因此,我们可以直接从命令提示符中调用枚举。
    // Java程序,展示在枚举内部声明main方法.
    enum Color
    {
        RED, GREEN, BLUE;
        // 测试代码
        public static void main(String[] args)
        {
            Color c1 = Color.RED;
            System.out.println(c1);
        }
    }

    输出:

    RED

枚举和继承:

  • 所有枚举都隐式扩展java.lang.Enum类。由于类只能扩展Java中的一个父级,因此枚举不能扩展任何其他内容。
  • toString()方法java.lang.Enum类中被重写,该类返回枚举常量名称。
  • 枚举可以实现许多接口。

values(),ordinal()和valueOf()方法:

  • 这些方法位于java.lang.Enum内部。
  • values()方法可用于返回枚举中存在的所有值。
  • 顺序在枚举中很重要。通过使用ordinal()方法,可以找到每个枚举常量索引,就像数组索引一样。
  • valueOf()方法返回指定字符串值的枚举常量(如果存在)。
    // Java程序,展示如何使用方法:values(), ordinal() and valueOf()
    enum Color
    {
        RED, GREEN, BLUE;
    }
    public class Test
    {
        public static void main(String[] args)
        {
            // 调用values()
            Color arr[] = Color.values();
            // enum和循环
            for (Color col : arr)
            {
                // 调用 ordinal()
                System.out.println(col + " at index "
                                 + col.ordinal());
            }
            // 调用valueOf().
            // 如果解注释最后一行代码,会报错
            System.out.println(Color.valueOf("RED"));
            // System.out.println(Color.valueOf("WHITE"));
        }
    }

    输出:

    RED at index 0
    GREEN at index 1
    BLUE at index 2
    RED

枚举和构造函数:

  • 枚举可以包含构造函数,并且在枚举类加载时针对每个枚举常量分别执行。
  • 我们无法显式创建枚举对象,因此无法直接调用枚举构造函数。

枚举和方法:

  • 枚举既可以包含具体方法,也可以包含抽象方法。如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它
    // Java代码,展示enums可以有构造器和对应函数
    // 一个enum
    enum Color
    {
        RED, GREEN, BLUE;
        // enum构造器,对每个常量分别调用
        private Color()
        {
            System.out.println("构造器被调用 : " +
            this.toString());
        }
        public void colorInfo()
        {
            System.out.println("普遍的颜色");
        }
    }
    public class Test
    {
        // 测试代码
        public static void main(String[] args)
        {
            Color c1 = Color.RED;
            System.out.println(c1);
            c1.colorInfo();
        }
    }

    输出:

    构造器被调用 : RED
    构造器被调用 : GREEN
    构造器被调用 : BLUE
    RED
    普遍的颜色