【JavaSE】枚举类——规范的类

简介: 走进枚举类

前言

《北史·恩幸传序》:"其间盗官卖爵,污辱宫闱者多矣,亦何可 枚举哉。" 从词中不难看出,所谓的枚举就是一
一列举出来,枚举拥有很明显的一个特征,我列举出来的对象已经具有了某种属性,枚举的结果是令别人观察的一种方式,即所谓的 只读性
在面向对象过程中不断强调简化,高效的特性,但枚举类在以往类的基础上更像是一种规范类

枚举

一.自定义类实现枚举

单从Java类的层面来看,我想要枚举出的东西都是一个一个具有特定属性的对象实例,在创建对象的类中我需要给予他们成员属性,并且通过构造器初始化对象
下面从一个简单的例子具体阐述用自定义类实现枚举——列举出四季以及特征 例如:
public class Enumeration01 {
    public static void main(String[] args) {
        System.out.println(Season.AUTUNN);
        System.out.println(Season.SPRING);
        System.out.println(Season.WINTER);
        System.out.println(Season.SUMMER);
    }
class Season{
    private String type; //季节
    private String desc; //特征
    public static Season SPRING = new Season("春天","温暖");
    public static Season WINTER = new Season("冬天","寒冷");
    public static Season AUTUNN = new Season("秋天","凉爽");
    public static Season SUMMER = new Season("夏天","炎热");
    private Season(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }
    public String getType() {
        return type;
    }
    public String getDesc() {
        return desc;
    }
    @Override
    public String toString() {
        return type + desc;
    }
}

==注意:枚举对象通常使用全部大写==

从上述方式可以看出:
以往在主函数新建对象调用成员的方式已经一去不复返了,取而代之的是把new出来的一组不同对象写在了一个类里,这样我们就可以直接在主函数调用对象就行,而==不需要重新new==。
这样做的好处已经充分体现: 一年只有四季,我不可能枚举出来不存在的季节,因为我已经在Season类中规范了
我把构造器私有化,这就只允许我在本类初始化对象 只提供get()方法不提供set()方法,显然是只让你拿不让你改 这些就体现了只读性

二.enum关键字实现枚举

在自定义类枚举的基础上,利用enum关键字实现枚举其实就是一个简化的过程
1.使用关键字==enum替代 class==
2.public static final Season SPRING = new Season("春天","温暖") 等价于SPRING("春天","温暖")常量名(实参列表)
3.==同样私有化构造器的目的是为了不在外部new==体现规范性
4.如果有多个常量(对象),使用,号间隔即可

例如:

public class Enumeration02 {
    public static void main(String[] args) {
        System.out.println(Season2.SUNMER);
        System.out.println(Season2.AUTUIN);
        System.out.println(Season2.WINTER);
        System.out.println(Season2.SPRING);
    }
}
//使用enum关键字实现枚举
enum Season2{
    SPRING("春天","温暖"),WINTER("冬天","寒冷"),AUTUIN("秋天","凉爽"),SUNMER("夏天","炎热");
    private String name;
    private String desc;
    private Season2(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
    @Override
    public String toString() {
        return   name + desc ;
    }
}

从上述可以看出,整个程序代码中没有出现一个new,大家可以想一下为什么?

三.枚举实现原理

我们都知道,我们写出来的enum是Java源代码的一部分,而在源代码通过编译器编译的过程中,当读到enum这个关键字时,编译器会为我们创建一个枚举类,这个类有一个特性,那就是继承了Java.lang中的Enum类,因此也得到了很多新的功能,从源码中不难看出:

==正因java单继承机制的原因所以枚举类不可以继承别的类==
在这里插入图片描述
==个人理解==:之所以和自定义实现枚举类不同是因为enum类继承了Enum类,源代码经过编译过程中重写了很多我们看不见的方法,而这些操作都是编译器在为我们默默背负
目前水平有限,仅是个人见解供大家参考~

四.枚举类与接口

enum类并不能再继承其它类,但并不妨碍它实现接口,因此enum类同样是可以实现多接口的

例如:

public class Main {
    public static void main(String[] args) {
        Person.Boy.play();
    }
}
interface Way{
    void play();
}
enum Person implements Way{
    Boy();
    @Override
    public void play() {
        System.out.println("玩一下吧,别学了");
    }
}

五.枚举类与switch

==这也是一种新的枚举形式==
利用switch语句来判断枚举对象所对应人为规定的类型是什么

enum Person{
    BOY,GIRL,PERSON;
}
 class EG{
    public void type(Person person) {
        switch (person) {
            case BOY:
                System.out.println("男孩");
                break;
            case GIRL:
                System.out.println("女孩");
                break;
            case PERSON:
                System.out.println("人");
                break;
        }
   }
    public static void main(String[] args){
        type(Person.BOY);
        type(Person.GIRL);
        type(Person.PERSON);
    }
 }

▶️运行结果:

男孩
女孩
人

六.进阶用法values() valueOf()

values()方法的作用就是获取枚举类中的所有变量,并==作为数组返回==,而valueOf(String
name)方法与Enum类中的valueOf方法的作用类似,valueOf() 将输入的字符串转成枚举对象,要求==字符串必须为已有常量名==

例如:

public class Enumeration02 {
    public static void main(String[] args) {
    System.out.println("----------values----------");
        Season[] season = Season.values(); //values
        for (Season season1 : season) {
            System.out.println(season1);
        }
        System.out.println("----------valueOf----------");
        Season spring = Season.valueOf("SPRING");  //values of
        System.out.println(spring);
    }
}
//使用enum关键字实现枚举
enum Season {
    SPRING("春天", "温暖"), WINTER("冬天", "寒冷"), 
    AUTUIN("秋天", "凉爽"), SUNMER("夏天", "炎热");
    private String name;
    private String desc;
    Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    public String getName() {
        return name;
    }
    public String getDesc() {
        return desc;
    }
    @Override
    public String toString() {
        return name + desc;
    }
}

▶️运行结果:
在这里插入图片描述
在这里插入图片描述

相关文章
|
Java 开发工具 git
你需要的Java jar包反编译工具来了
在我们进行java开发过程中,有时候需要看一下某个jar包是否确定已经是我们更新过的代码,那么此时,就需要使用反编译工具看一下jar包中对应的java源码。下文介绍一个高效率的jar包源码查看工具:jd-gui
你需要的Java jar包反编译工具来了
|
SQL Web App开发 Java
java.sql.SQLException: Unsupported character encoding 'utf8mb4'.
版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢。 https://blog.csdn.net/testcs_dn/article/details/76199827 四月 12, 2017 3:47:52 下午 org.
5139 0
|
11月前
|
安全 Linux 虚拟化
Palo Alto Cortex XSOAR 8.8 for ESXi - 安全编排、自动化和响应 (SOAR) 平台
Palo Alto Cortex XSOAR 8.8 for ESXi - 安全编排、自动化和响应 (SOAR) 平台
296 0
Palo Alto Cortex XSOAR 8.8 for ESXi - 安全编排、自动化和响应 (SOAR) 平台
|
Java 编译器
Java 泛型详细解析
本文将带你详细解析 Java 泛型,了解泛型的原理、常见的使用方法以及泛型的局限性,让你对泛型有更深入的了解。
476 2
Java 泛型详细解析
|
JavaScript
vscode——如何调试typescript
vscode——如何调试typescript
425 4
yyyy-MM-dd和YYYY-MM-dd不是一样的吗?
最近的一个项目中遇到了一个非常有趣的bug,原来yyyy-MM-dd和YYYY-MM-dd是有差异的,具体有什么不同呢?
|
存储 Prometheus 监控
基于Elasticsearch的指标可观测实践
主要介绍Elasticsearch为什么做时序引擎、Elasticsearch做时序引擎的挑战、Elasticsearch 时序引擎特性介绍、阿里云基于Elasticsearch TimeStream介绍。文章结尾更有关于《阿里云Elasticsearch在时序场景下的深入探索》的demo演示视频。
1849 145
基于Elasticsearch的指标可观测实践
|
Java 索引
Java开发指南 | 第三十篇】Java 枚举(enum)
Java开发指南 | 第三十篇】Java 枚举(enum)
265 1
|
存储 JSON 关系型数据库
MySQL JSON 类型:功能与应用
MySQL JSON 类型:功能与应用
|
Java API Android开发
Java通过JNI调用C++的DLL库
Java通过JNI调用C++的DLL库
322 0

热门文章

最新文章