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


学习目录

  • 前言
  • 枚举
    • 一.自定义类实现枚举
    • 二.enum关键字实现枚举
    • 三.枚举实现原理
    • 四.枚举类与接口
    • 五.枚举类与switch
    • 六.进阶用法values() valueOf()

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

【JavaSE|【JavaSE】枚举类——规范的类】注意:枚举对象通常使用全部大写
从上述方式可以看出:
以往在主函数新建对象调用成员的方式已经一去不复返了,取而代之的是把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() { returnname + desc ; } }

从上述可以看出,整个程序代码中没有出现一个new,大家可以想一下为什么?
三.枚举实现原理
我们都知道,我们写出来的enum是Java源代码的一部分,而在源代码通过编译器编译的过程中,当读到enum这个关键字时,编译器会为我们创建一个枚举类,这个类有一个特性,那就是继承了Java.lang中的Enum类,因此也得到了很多新的功能,从源码中不难看出:
正因java单继承机制的原因所以枚举类不可以继承别的类
JavaSE|【JavaSE】枚举类——规范的类
文章图片

个人理解:之所以和自定义实现枚举类不同是因为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; } }

??运行结果:
JavaSE|【JavaSE】枚举类——规范的类
文章图片

JavaSE|【JavaSE】枚举类——规范的类
文章图片

    推荐阅读