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