转载

还有你不知道的Java枚举特性(上篇)

博文Java 枚举的本质 跟大家一起学习了 Java 语言中枚举到底是什么,探索其本质和原理。用一句话来概括其本质就是:“Java 中的枚举是一个特殊的 Java 类”,有兴趣的同学可以点击了解上面那篇文章。

今天跟大家一起学习和总结一下 Java 中的枚举的其他特性和用途,由于内容较多,这次的分享分为两篇文章来写,欢迎大家拍砖、指正和交流!

本篇主要内容:

  • Java switch 语句支持枚举类型以及注意事项
  • Java 枚举的常量使用
  • 如何在自定义枚举中自定义成员变量和成员方法、静态方法
  • Java 枚举实现接口

下篇主要内容:

  • Java 枚举是一个特殊的类,聊聊其方法的重写
  • 如何使用接口来组织 Java 枚举?
  • JDK 数据结构中关于枚举的集合 EnumSet 和字典 EnumMap

switch 语句支持枚举

JDK1.5 才开始有枚举类型,同时可爱的 Java 组织丰富了 switch 语句,即支持枚举。

我们还是动手写个例子~

定义一个枚举 Color ,示例如下:

public enum Color {
    RED("red color", 0), 
    GREEN("green color", 1),
    BLUE("blue color", 2), 
    YELLOW("yellow color", 3);
 
    // 构造方法
    Color(String name, int id) {
        _name = name;
        _id = id;
    }
 
    private String _name;
    private int _id;
 
    public String getName(){
        return _name;
    }
 
    public int getId(){
        return _id;
    }
 
    public static Color getColor(int max){
        Random random = new Random(System.currentTimeMillis());
        int num = random.nextInt(max);
        switch (num) {
        case 0:
            return Color.RED;
        case 1:
            return Color.GREEN;
        case 2:
            return Color.BLUE;
        case 3:
            return Color.YELLOW;
        default:
            return Color.BLUE;
        }
    }
}

为枚举 Color 提供了一个静态方法 getColor ,可以获取随机的颜色值。

那么,可以结合 switch 语句这样使用,示例代码如下:

public static void main(String[] args){
    int len = Color.values().length;
    Color color = Color.getColor(len);
    switch (color) {
    case RED:
        System.out.println("select " + "RED");
        break;
    case GREEN:
        System.out.println("select " + "GREEN");
        break;
    case BLUE:
        System.out.println("select " + "BLUE");
        break;
    case YELLOW:
        System.out.println("select " + "YELLOW");
        break;
    default:
        System.out.println("select " + "unknow!!");
        break;
    }
}

可以看出, switch 语句中条件值是 Color 对象。

这里提醒大家要注意一个问题,如果 case 的条件带上类的名字,代码是无法通过编译的。如下面的代码(错误示例):

// Error
case Color.RED:
    System.out.println("select " + "RED");
    break;

编译的错误信息:

Error: An enum switch case label must be the unqualified name of an enumeration constant

switch case 语句结合枚举使用时,只能写枚举类定义的变量名称,不能加类名。

当常量使用

一般在 Java 中我们定义常量最常用的方式就是使用下面的方式,如下:

public static final int MAX_NAME_LENGTH = 0x1112;

有了枚举之后,也可以使用枚举来定义常量。

public enum Color {
    YELLOW, BLANK, RED, GREEN
}

这样就可以把一些相关的常量放到定义的枚举当中了。

自定义方法、成员变量

上面的例子中自定义的一个枚举 Color ,大家可以看到可以给它添加成员变量 _id_name ,构造方法和其他方法 getColor (静态方法)。

如果这部分很难理解,建议去阅读Java 枚举的本质 这篇文章。

实现接口

所有的枚举类都继承自 Enum ,因为 Java 不支持多继承,所以枚举无法继承其它类。

枚举既然是和 Java 的普通类基本一样,那么,枚举当然也可以实现接口。

下面是枚举 Color 实现接口 Paint 的例子,如下:

interface Paint{
        void setColor();
    }

public enum Color implements Paint {
    RED("red color"),
    GREEN("green color"),
    BLUE("blue color"),
    YELLOW("yellow color");

    Color(String name) {
        _name = name;
    }

    private String _name;

    @Override
    public void setColor(){
        System.out.println("Current paint color: " + _name);
    }
}

还可以采用匿名内部类的方式,让每个枚举值实现接口 Paint 的方法,示例如下:

public enum Color implements Paint {
        RED("red color") {
            @Override
            public void setColor(){
                System.out.println("Current paint color: " + RED._name);
            }
        },
        GREEN("green color") {
            @Override
            public void setColor(){
                System.out.println("Current paint color: " + GREEN._name);
            }
        },
        BLUE("blue color") {
            @Override
            public void setColor(){
                System.out.println("Current paint color: " + BLUE._name);
            }
        },
        YELLOW("yellow color") {
            @Override
            public void setColor(){
                System.out.println("Current paint color: " + YELLOW._name);
            }
        };

        Color(String name) {
            _name = name;
        }

        private String _name;

        @Override
        public void setColor(){
            System.out.println("Current paint color: " + _name);
        }
}

可以写个方法测试一下,如下:

public static void main(String[] args){
    for (Color color : Color.values()) {
        color.setColor();
    }
}

输出结果,如下:

Current paint color: red color
Current paint color: green color
Current paint color: blue color
Current paint color: yellow color

人生没有永远的赢家,切勿大喜大悲,要以平常心对待一切~

还有你不知道的Java枚举特性(上篇)

原文  http://www.veryitman.com/2019/08/09/还有你不知道的Java枚举特性(上篇)/
正文到此结束
Loading...