前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《Java-SE-第三十六章》之枚举

《Java-SE-第三十六章》之枚举

作者头像
用户10517932
发布2023-10-07 14:53:21
1020
发布2023-10-07 14:53:21
举报
文章被收录于专栏:929KC929KC

前言

在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”

博客主页:KC老衲爱尼姑的博客主页 博主的github,平常所写代码皆在于此 共勉:talk is cheap, show me the code 作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!

枚举

概述

枚举类型是Java5以后引用的新特性,它是一种特殊的数据类型,之所以特殊是因为它既是一种类类型但是又比类类型多了一些特殊的约束。其主要的用途是:将一组常量组织起来。在此之前表示一组常量通常是使用定义常量的方式:

代码语言:javascript
复制
public class CoolDemo {
    public static  final int RED = 1;
    public static  final int GREEN = 2;
    public static  final int BLACK = 3;
}

但是常量举例有不好的地方,比如:可能存在定义int值相同的变量,但是它有可能被误以为是RED,编译器也不会有任何警告,因此这种方式在枚举出现后就不提倡了,我们利用枚举类型来重新定义上述的常量。

代码语言:javascript
复制
public enum CoolType {
    RED,BLACK,GREEN
}

在定义枚举类型的时我们使用的关键字是enum,enum是定义枚举类型。枚举类型Cool分别定义了红色,黑色,绿色。这些值一般都是大写字母,多个值之间用逗号隔开。那么如何使用呢?如下

代码语言:javascript
复制
public class Demo {
    public static void main(String[] args) {
        CoolType black = CoolType.BLACK;
    }
}

我们使用enum关键字定义的枚举类,本质上是java.lang.Enum的子类。虽然自己编写的枚举类,没有显示的继承Enum,但是它默认继承和这个类。

基本使用

枚举和switch

使用swtich进行条件判断的时候,条件参数一般只能是整型,字符型。而枚举类型也被switch所支持,字符串在java1.7后也被switch所支持。接下来,我们简单看一下枚举和switch的使用:

代码语言:javascript
复制
public class EnumDemo4 {

    public static void printName(ColorType color){
        switch (color){
            //无需使用Color进行引用
            case RED:
                System.out.println("蓝色");
                break;
            case BLACK:
                System.out.println("红色");
                break;
            case GREEN:
                System.out.println("绿色");
                break;
        }
    }

    public static void main(String[] args){
        printName(ColorType.RED);
        printName(ColorType.BLACK);
        printName(ColorType.GREEN);
    }
}
向enum类中添加方法与自定义构造函数
代码语言:javascript
复制
public enum CoolType {
    RED("红色", 1),
    BLACK("黑色", 2),
    GREEN("绿色", 3);

    private String color;
    private int key;

    CoolType(String color, int key) {
        this.color = color;
        this.key = key;
    }

    public String getColor() {
        return color;
    }

    public int getKey() {
        return key;
    }

    public static void main(String[] args) {
        for (CoolType c: CoolType.values()) {
            System.out.println("color:"+c.color+"key:"+c.key);
        }
    }
}

运行结果 :

color:红色key:1 color:黑色key:2 color:绿色key:3

Process finished with exit code 0

枚举类不能进行反射的原因

我们来看看构造方法源码

代码语言:javascript
复制
	@CallerSensitive
    public T newInstance(Object ... initargs)
        throws InstantiationException, IllegalAccessException,
               IllegalArgumentException, InvocationTargetException
    {
        if (!override) {
            //这就是判断如果是枚举类型那么就只接抛出异常了, 也就不能进行构造了
            if (!Reflection.quickCheckMemberAccess(clazz, modifiers)) {
                Class<?> caller = Reflection.getCallerClass();
                checkAccess(caller, clazz, null, modifiers);
            }
        }
        if ((clazz.getModifiers() & Modifier.ENUM) != 0)
            throw new IllegalArgumentException("Cannot reflectively create enum objects");
        ConstructorAccessor ca = constructorAccessor;   // read volatile
        if (ca == null) {
            ca = acquireConstructorAccessor();
        }
        @SuppressWarnings("unchecked")
        T inst = (T) ca.newInstance(initargs);
        return inst;
    }

其中有一段代码

代码语言:javascript
复制
if ((clazz.getModifiers() & Modifier.ENUM) != 0)

这就是判断如果是枚举类型那么就只接抛出异常了, 也就不能进行构造了。

单例模式
代码语言:javascript
复制
public enum Singleton {
    INSTANCE;
    public static Singleton getInstance() {
        return INSTANCE;
    }

    public static void main(String[] args) {
        Singleton singleto1 = Singleton.getInstance();
        Singleton singleto2 = Singleton.getInstance();
        System.out.println("两个实例是否相同:"+(singleto1==singleto2));
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 枚举
    • 概述
      • 基本使用
        • 枚举和switch
        • 向enum类中添加方法与自定义构造函数
        • 枚举类不能进行反射的原因
        • 单例模式
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档