编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 1.1String深入理解原理
  • 1.2浮点型数据深入研究
  • 1.3数据装箱和拆箱原理
  • 1.4泛型由来和设计思想
  • 1.5加密和解密设计和原理
  • 2.1面向对象设计思想
  • 2.2抽象类和接口设计
  • 2.3封装和继承设计思想
  • 2.4复用和组合设计思想
  • 2.5对象和引用设计思想
  • 3.1IO流设计思想和原理
  • 3.2为何设计序列化数据
  • 3.3各种拷贝数据比较
  • 3.4高效文件读写的原理
  • 4.1反射性能探索和优化
  • 4.2为何要设计注解思想
  • 4.3动态代理的设计思想
  • 4.4SPI机制设计的思想
  • 4.5异常设计和捕获原理
  • 4.6虚拟机如何处理异常
  • 4.7四种引用设计思想
  • 5.1线程的前世今生探索
  • 5.2线程通信的设计思想
  • 5.3线程监控和Debug设计
  • 5.4线程和JVM之间联系
  • 5.5线程池使用技巧介绍
  • 5.6线程池设计核心原理
  • 5.7线程如何最大优化
  • 6.1多线程并发经典案例
  • 6.2并发安全前世今生
  • 6.3线程安全如何保证
  • 6.4变量的线程安全探索
  • 6.5并发上下文切换原理
  • 6.6理解CAS设计和由来
  • 6.7协程设计思想和原理
  • 6.8事物并发模型解读
  • 6.9并发设计模型研究
  • 6.10并发编程数据一致性
  • 6.11锁问题的定位和修复
  • 6.12多线程如何性能调优
  • 7.1类的加载过程和原理
  • 7.2对象布局设计的原理
  • 7.3双亲委派机制设计思想
  • 7.5代码攻击和安全防护
  • 7.6设计动态生成Java类

4.2为何要设计注解思想

目录介绍

  • 01.什么是枚举
  • 02.枚举简单使用
    • 2.1 枚举的创建
    • 2.2 枚举的使用
  • 03.枚举是类类型
  • 04.枚举的一些方法
  • 05.枚举实现接口

01.什么是枚举

  • 枚举(Enum)是在Java 5中添加的新的类型
    • 从技术上来讲,由于enum是一个类,一个enum可以有构造方法和方法。
    • 如果有构造方法,那必须是私有的。如果一个enum定义了枚举值之外的其他内容,枚举值必须在其他内容之前定义,并且最后的枚举值用一个分号结束

02.枚举简单使用

2.1 枚举的创建

  • 创建枚举需要使用到关键字 enum ,如下所示:
    enum Letter{
    	A,B,C,D
    }
    • 标识符 A、B、C、D 等被称为枚举常量,每个枚举常量被隐式声明为Letter的公有静态final成员。
    • 每个枚举常量的类型是声明它们的枚举的类型。

2.2 枚举的使用

  • 定义了枚举后,可以创建枚举类型的变量,但是不能使用new关键字来实例化枚举,而是通过与基本类型类似的方式声明,例如:
    Letter letter1=Letter.A;
    Letter letter2=Letter.B;
  • 可以使用关系运算符“==”来比较两个枚举变量的相等性,例如:
    if (letter1 == letter2) {
    	System.out.println("相等");
    } else {
    	System.out.println("不相等");
    }
  • 枚举值也可以用于控制switch语句,例如:
    switch (letter1) {
        case A:
        	System.out.println("A");
        	break;
        case B:
        	System.out.println("B");
        	break;
    }
    • 在case语句中,枚举常量的名称没有使用枚举类型的名称进行限定,即使用的是 A 而不是 Letter.A ,这是因为 switch 表达式中的枚举类型已经隐式指定了case常量的枚举类型,所以在case语句中不需要使用枚举类型的名称对常量进行限定,如果试图这么做,会造成编译时错误
  • 遍历打印枚举如下所示
    public enum Color {
    	RED, GREEN, BLANK, YELLOW
    }
    // 遍历输出
    for (Color color : Color.values()) {
    	System.out.println(color);
    }
    • 输出结果为
    RED
    GREEN
    BLANK
    YELLOW

03.枚举是类类型

  • Java中枚举是类类型,虽然不能使用new关键字来实例化枚举,但是枚举却有和其他类相同的功能,可以为枚举提供构造函数、实例变量和方法,甚至可以实现接口
    • 需要理解的是:每个枚举变量都是所属枚举类型的对象。因此,如果为枚举定义了构造函数,那么当创建每个枚举常量时都会调用该构造函数
    • 为枚举 Letter 提供一个实例变量 index、一个返回index值的方法、两个不同的构造函数。
    • 对于每一个枚举常量,指定要调用的构造函数的方法是通过每个常量后面的圆括号中来加以指定
  • 看一下下面的案例代码
    public enum Letter {
    
    	KK(), A(1), B(2), C(3), D(5);
    
    	private int index;
    
    	Letter(int index) {
    		this.index = index;
    	}
    
    	Letter() {
    		this.index = 0;
    	}
    	
    	public int getIndex() {
    		return index;
    	}
    }
    
    public static void main(String[] args) {
    	Letter letter = Letter.KK;
    	//输出值为:0
    	System.out.println("索引:" + letter.getIndex());
    	 letter = Letter.B;
    	 //输出值为:2
    	System.out.println("索引:" + letter.getIndex());
    }
  • 此外,枚举有两条限制:
    • 1.枚举不能继承其他类。但是所有枚举都隐式自动继承超类 java.lang.Enum
    • 2.枚举不能是超类。即枚举不能进行扩展

04.枚举的一些方法

4.1 values()

  • values() 方法返回一个包含枚举常量列表的数组,例如:
    enum Letter {
    	A, B, C, D
    }
    
    public static void main(String[] args) {
    	Letter[] values = Letter.values();
    	for (Letter letter : values) {
    		System.out.println(letter);
    	}
    }

4.2 valueOf(String)

  • valueOf(String) 方法返回与传递的字符串参数相对应的枚举常量,例如:
    enum Letter {
    	A, B, C, D
    }
    
    public static void main(String[] args) {
    	String str = "A";
    	Letter le=Letter.valueOf(str);
    	//输出值为:A
    	System.out.println(le);
    }

4.3 ordinal()

  • ordinal() 方法返回枚举常量在常量列表中位置的值,这称为枚举常量的序数值,例如:
    enum Letter {
    	A, B, C, D
    }
    
    public static void main(String[] args) {
    	Letter letter = Letter.A;
    	//输出值为:0
    	System.out.println("序数值:" + letter.ordinal());
    	letter = Letter.B;
    	//输出值为:1
    	System.out.println("序数值:" + letter.ordinal());
    }

4.4 compareTo(Enum)

  • compareTo(Enum) 方法用于比较相同类型的两个枚举常量的序数值,例如:
    enum Letter {
    	A, B, C, D
    }
    
    public static void main(String[] args) {
    	Letter letter1 = Letter.A;
    	Letter letter2 = Letter.B;
    	Letter letter3 = Letter.C;
    	compare(letter1, letter2);
    	compare(letter1, letter3);
    	compare(letter2, letter3);
    	// 输出值为:
    	// A小于B
    	// A小于C
    	// B小于C
    }
    
    public static void compare(Letter letter1, Letter letter2) {
    	if (letter1.compareTo(letter2) > 0) {
    		System.out.println(letter1.name() + "大于" + letter2.name());
    	} else if (letter1.compareTo(letter2) < 0) {
    		System.out.println(letter1.name() + "小于" + letter2.name());
    	} else {
    		System.out.println(letter1.name() + "等于" + letter2.name());
    	}
    }

5.5 equals(Enum)

  • equals(Enum)用于比较两个对象的相等性,只有两个对象都引用同一个枚举中相同的常量时,返回值才为 true
    enum Letter {
    	A, B, C, D
    }
    
    public static void main(String[] args) {
    	Letter letter1 = Letter.A;
    	Letter letter2 = Letter.B;
    	Letter letter3 = Letter.A;
    	//输出值:不相等
    	if (letter1.equals(letter2)) {
    		System.out.println("相等");
    	} else {
    		System.out.println("不相等");
    	}
    	//输出值:相等
    	if (letter1.equals(letter3)) {
    		System.out.println("相等");
    	} else {
    		System.out.println("不相等");
    	}
    }

05.枚举实现接口

  • 枚举实现接口的案例如下所示
    public interface Command {
    	void execute();
    }
    public enum Color implements Command {
    	RED, GREEN, BLUE;
    
    	@Override
    	public void execute() {
    		switch (this) {
    		case RED:
    			System.out.println("选中的是红色");
    			break;
    		case GREEN:
    			System.out.println("选中的是绿色");
    			break;
    		case BLUE:
    			System.out.println("选中的是蓝色");
    			break;
    		}
    	}
    }
  • 枚举实现了Command接口,在不同枚举值下执行不同的行为
    public static void main(String[] args) {
    	select(Color.BLUE);
    	select(Color.RED);
    }
    
    public static void select(Color color){
    	color.execute();
    }
    • 运行结果如下
    选中的是蓝色
    选中的是红色
  • 而枚举Color也可以以另一种形式来实现Command接口,使用效果也完全相同
    public enum Color implements Command {
    	
    	RED {
    		public void execute() {
    			System.out.println("选中的是红色");
    		}
    	},
    	GREEN {
    		public void execute() {
    			System.out.println("选中的是绿色");
    		}
    	},
    	BLUE {
    		public void execute() {
    			System.out.println("选中的是蓝色");
    		}
    	};
    }
贡献者: yangchong211
上一篇
4.1反射性能探索和优化
下一篇
4.3动态代理的设计思想