【原理】
写一个枚举,相信大家都会,如:
1public enum City {Guangzhou, Shenzhen, Dongguan}
这是个城市的枚举类,包含广州、深圳、东莞三个城市枚举值,但是它怎么用呢?它的背后的真面目是怎样的呢?
下面我们来反编译一下这个枚举,结果得出:
1public final class City extends Enum<City> {
2 public static final City[] values() {
3 return (City[]) $VALUES.clone();
4 }
5 public static City valueOf(String name) {
6 return (City) Enum.valueOf(City, name);
7 }
8 // 构造函数
9 private City(String s, int i) {
10 super();
11 }
12 public static final City Guangzhou;
13 public static final City Shenzhen;
14 public static final City Dongguan;
15
16 private static final City $VALUES[];
17 // 实例化枚举
18 static {
19 Guangzhou = new City("Guangzhou", 0);
20 Shenzhen = new City("Shenzhen", 1);
21 Dongguan = new City("Dongguan", 2);
22 $VALUES = (new City[] { Guangzhou, Shenzhen, Dongguan });
23 }
24}
从这个类中我们可以看出几点:
1)是个类 并且是final类,继承与java.lang.Enum类 不可继承。
2)用static块初始化。
3)定义了几个final类型的City对象,并且在static块中初始化。
由此可以知道,enum本质是一个final类,而JavaAPI的设计出的这个Enum,是一个被封装之后的类,旨在提供一种代码简洁而高效的类型管理组件,简化开发者编码。这当然是废话啦,各位看看,同样是功能的两种写法哪一种更简洁?哪一种更值得用?
我们再来看看enum接口类的源码:
1public abstract class Enum<E extends Enum<E>>
2 implements Comparable<E>, Serializable {
3 //枚举常量名称
4 private final String name;
5 //返回枚举常量名称
6 public final String name() {
7 return name;
8 }
9 //枚举常量的序数 初始值为0 根据位置而得出
10 private final int ordinal;
11// 返回枚举常量的序数
12 public final int ordinal() {
13 return ordinal;
14 }
15 //私有构造函数,程序无法直接调用改函数进行初始化
16 //它用于由响应枚举类型声明的编译器发出的代码
17 //@param name:枚举常量的名称
18 //@param ordinal: 枚举常量的序数
19 protected Enum(String name, int ordinal) {
20 this.name = name;
21 this.ordinal = ordinal;
22 }
23 //和name()是一个意思
24 public String toString() {
25 return name;
26 }
27 //判断是否相同对象的函数
28 public final boolean equals(Object other) {
29 return this==other;
30 }
31 //为枚举返回一个hashCode
32 public final int hashCode() {
33 return super.hashCode();
34 }
35 //克隆函数
36 protected final Object clone() throws CloneNotSupportedException {
37 throw new CloneNotSupportedException();
38 }
39 //比较此枚举与指定对象的顺序(编号)。
40 //在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。
41 //枚举常量只能与相同枚举类型的其他枚举常量进行比较。
42 //该方法实现的自然顺序就是声明常量的顺序。
43 public final int compareTo(E o) {
44 Enum<?> other = (Enum<?>)o;
45 Enum<E> self = this;
46 if (self.getClass() != other.getClass() && // optimization
47 self.getDeclaringClass() != other.getDeclaringClass())
48 throw new ClassCastException();
49 return self.ordinal - other.ordinal;
50 }
51// 以下方法略过....
52}
有了这个抽象类Enum的源码,我们基本上知道枚举是怎么使用的了,下面是一些常用的方法:
方法名 |
返回值 |
说明 |
name() |
String |
返回枚举的名称 |
ordinal() |
int |
返回枚举常量的序数 |
compareTo(E o) |
int |
比较此枚举与指定对象的顺序(编号)。 在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。 枚举常量只能与相同枚举类型的其他枚举常量进行比较。 该方法实现的自然顺序就是声明常量的顺序 |
【使用方式】
Enum类实现三种枚举:
1)最常用:
1public enum Num {
2 ONE,TWO,THREE;
3}
2)定义带参构造函数:
1public enum EnumTest{
2 ONE("1","YI");
3 private String name;
4 private String value;
5 //一个参
6 private EnumTest(String name){
7 this.name=name;
8 }
9 //两个参数
10 private EnumTest(String name,String value){
11 this.name=name;
12 this.value=value;
13 }
14 //...多个参数
15 public static void main(String[] args) {
16 System.out.println(EnumTest.ONE.name);
17 System.out.println(EnumTest.ONE.value);
18 }
19}
3)抽象方法实现:
1public enum EnumTest{
2 ONE("1") {
3 @Override
4 public void handle() {
5 // TODO Auto-generated method stub
6 }
7 };
8 private String name;
9 private EnumTest(String name){
10 this.name=name;
11 }
12 //定义抽象方法
13 public abstract void handle();
14 public static void main(String[] args) {
15 //调用
16 EnumTest.ONE.handle();
17 }
18}
【注意事项】
1)不能继承,因为枚举类本身已经继承了Enum抽象类,而Java是单继承
2)枚举的第一行必须是枚举项,所有其它的变量和方法都必须在枚举项后面
3) 枚举类可以定义抽象方法,但没枚举项必须重写所有抽象方法
4)可以在switch中使用枚举,它的使用方法如下:
1switch(EnumTest.ONE){
2
3case ONE:
4
5break;
6
7case TWO:
8
9break;
10
11}
觉得本文对你有帮助?请分享给更多人
关注「编程无界」,提升装逼技能
相关推荐
Java ---- enum --- 枚举类案例
Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类Java SE程序 Enum枚举类...
valueOf(String arg0) 方法是枚举类中的一个静态方法,它通过传入的 arg0 字符串解析出一个该枚举类的实例,其中传入的字符串必须是元素列表的名称之一,否则将抛出 java.lang.IllegalArgumentException 异常。...
Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...
本项目"test-enum-demo-master"显然是一个用于演示如何通过反射来操作枚举类的示例。 首先,让我们理解枚举类的基本概念。枚举类在Java中用于定义一组相关的固定数量的值,这些值通常代表常量。例如: ```java ...
在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int类型的硬编码值更安全、更具可读性。本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用...
尽管枚举类不能被继承,但每个枚举类型都隐式地继承了`java.lang.Enum`类,这意味着它们可以实现接口并提供具体实现。这使得枚举可以具有多态行为。 6. 枚举的序列化 默认情况下,枚举是可序列化的。如果不需要...
全面掌握 Java 枚举类型(enum type) Java 枚举类型是一种特殊的数据类型,它可以取有限个数的明确值。枚举类型的引入解决了 int 枚举模式和 String 枚举模式的缺点,提供了类型安全性、可读性和性能等优势。 ...
10-enum枚举
在Java编程语言中,`Enum`(枚举)是一种特殊的类类型,用于定义固定的、预定义的常量集合。它们在程序设计中扮演着重要的角色,特别是在需要表示一组固定值时,如状态、颜色、星期等。本资源包提供了一些关于`Enum`...
虽然枚举不能作为其他类的父类,但它们默认继承了 `java.lang.Enum` 类,这意味着枚举实例可以使用 `Comparable` 和 `Serializable` 接口的方法。 此外,枚举可以实现接口,这使得它们可以具有自定义的行为。例如:...
`Laravel开发-enum-eloquent`的主题正是探讨如何在Laravel应用中使用枚举类型与Eloquent ORM进行交互。 首先,让我们了解一下什么是枚举。枚举是一种特殊的类,用于定义一组相关的常量。在PHP中,虽然原生支持枚举...
enum枚举的方法
`java-enum-mimetype`项目提供了一个使用Java枚举实现的MIME类型管理类,使得在Java程序中操作MIME类型变得更加简单和规范。 在Java中创建一个MIME类型的枚举类,可以遵循以下步骤: 1. **定义枚举类**: 首先,...
包含了关于枚举类的应用,以及枚举类和接口的组合应用,扩展映射关系。很有用的工具类。
Java枚举类型(enum)是Java语言中一种特殊的类,用于定义一组固定的常量。它在许多场景下作为替代常量或单例模式的选择,提供了更安全、更易读的代码。下面我们将深入探讨Java枚举类的用法及其优势。 1. **枚举的...
在 Java 中,枚举(enum)是一种特殊的类,它被用来表示一组固定的常量值。枚举类型自 JDK 1.5 开始引入,为开发者提供了一种更加安全、简洁的方式来处理一组固定的数据集合。枚举中的每个元素都是该枚举类型的对象...
`laravel-enum-master`压缩包可能包含了示例代码、测试用例和文档。解压后,你可以查看源代码了解其具体实现方式,学习如何在自己的项目中应用和扩展这个库。通常,`tests`目录下的单元测试能帮助理解枚举类的用法和...
枚举类自动继承了`java.lang.Enum`类,因此可以拥有方法和字段,也可以实现接口。 枚举的优势在于它们的类型安全性。当枚举用于表示有限的、预定义的选项时,编译器会检查所有枚举常量的引用,确保只有预先声明的...
- 枚举类型在编译后会被转换成一个特殊的类,该类继承自`java.lang.Enum`。 - 枚举中的每个元素实际上都是该类的一个实例,并且是静态和final的。 - 编译后的枚举类类似于以下结构: ```java public final ...