`
jaybril
  • 浏览: 50524 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java必知必会之----Enum枚举类揭秘

阅读更多

【原理】

写一个枚举,相信大家都会,如:

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)定义带参构造函数:


1
public 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}

 

 


 

觉得本文对你有帮助?请分享给更多人

关注「编程无界」,提升装逼技能

 


 

 

 

 
0
0
分享到:
评论

相关推荐

    Java ---- enum --- 枚举类案例

    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枚举类Java SE程序 Enum枚举类...

    java enum 枚举 学习资料

    valueOf(String arg0) 方法是枚举类中的一个静态方法,它通过传入的 arg0 字符串解析出一个该枚举类的实例,其中传入的字符串必须是元素列表的名称之一,否则将抛出 java.lang.IllegalArgumentException 异常。...

    Java枚举类型Enum的用法

    Java枚举类型(Enum)是Java SE 5.0引入的一种新的数据类型,它为开发者提供了更为强大且安全的方式来表示一组常量。枚举在Java中不仅是一个类,还是一种特殊的类型,允许我们定义自己的常量集合。接下来,我们将...

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    本项目"test-enum-demo-master"显然是一个用于演示如何通过反射来操作枚举类的示例。 首先,让我们理解枚举类的基本概念。枚举类在Java中用于定义一组相关的固定数量的值,这些值通常代表常量。例如: ```java ...

    高阶Java-Java枚举类型 enum 应用详解

    在Java编程语言中,枚举(enum)是一种特殊的类,用于定义一组固定的常量。它在许多场景下比使用常量或int类型的硬编码值更安全、更具可读性。本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用...

    java中enum枚举的详细用法

    尽管枚举类不能被继承,但每个枚举类型都隐式地继承了`java.lang.Enum`类,这意味着它们可以实现接口并提供具体实现。这使得枚举可以具有多态行为。 6. 枚举的序列化 默认情况下,枚举是可序列化的。如果不需要...

    全面掌握java枚举类型(enum-type)1

    全面掌握 Java 枚举类型(enum type) Java 枚举类型是一种特殊的数据类型,它可以取有限个数的明确值。枚举类型的引入解决了 int 枚举模式和 String 枚举模式的缺点,提供了类型安全性、可读性和性能等优势。 ...

    10-enum枚举.ts

    10-enum枚举

    JAVA高级编程中Enum枚举

    在Java编程语言中,`Enum`(枚举)是一种特殊的类类型,用于定义固定的、预定义的常量集合。它们在程序设计中扮演着重要的角色,特别是在需要表示一组固定值时,如状态、颜色、星期等。本资源包提供了一些关于`Enum`...

    java枚举实例代码

    虽然枚举不能作为其他类的父类,但它们默认继承了 `java.lang.Enum` 类,这意味着枚举实例可以使用 `Comparable` 和 `Serializable` 接口的方法。 此外,枚举可以实现接口,这使得它们可以具有自定义的行为。例如:...

    Laravel开发-enum-eloquent

    `Laravel开发-enum-eloquent`的主题正是探讨如何在Laravel应用中使用枚举类型与Eloquent ORM进行交互。 首先,让我们了解一下什么是枚举。枚举是一种特殊的类,用于定义一组相关的常量。在PHP中,虽然原生支持枚举...

    enum枚举的方法

    enum枚举的方法

    java-enum-mimetype:MIME 类型的 Java 枚举类

    `java-enum-mimetype`项目提供了一个使用Java枚举实现的MIME类型管理类,使得在Java程序中操作MIME类型变得更加简单和规范。 在Java中创建一个MIME类型的枚举类,可以遵循以下步骤: 1. **定义枚举类**: 首先,...

    enum枚举类的应用

    包含了关于枚举类的应用,以及枚举类和接口的组合应用,扩展映射关系。很有用的工具类。

    java枚举类用法

    Java枚举类型(enum)是Java语言中一种特殊的类,用于定义一组固定的常量。它在许多场景下作为替代常量或单例模式的选择,提供了更安全、更易读的代码。下面我们将深入探讨Java枚举类的用法及其优势。 1. **枚举的...

    java枚举类型enum的使用

    在 Java 中,枚举(enum)是一种特殊的类,它被用来表示一组固定的常量值。枚举类型自 JDK 1.5 开始引入,为开发者提供了一种更加安全、简洁的方式来处理一组固定的数据集合。枚举中的每个元素都是该枚举类型的对象...

    Laravel开发-laravel-enum

    `laravel-enum-master`压缩包可能包含了示例代码、测试用例和文档。解压后,你可以查看源代码了解其具体实现方式,学习如何在自己的项目中应用和扩展这个库。通常,`tests`目录下的单元测试能帮助理解枚举类的用法和...

    说说Java中的枚举 转 可以了,够了 包括EnumSet(Map)

    枚举类自动继承了`java.lang.Enum`类,因此可以拥有方法和字段,也可以实现接口。 枚举的优势在于它们的类型安全性。当枚举用于表示有限的、预定义的选项时,编译器会检查所有枚举常量的引用,确保只有预先声明的...

    Java中的Enum枚举用法.doc

    - 枚举类型在编译后会被转换成一个特殊的类,该类继承自`java.lang.Enum`。 - 枚举中的每个元素实际上都是该类的一个实例,并且是静态和final的。 - 编译后的枚举类类似于以下结构: ```java public final ...

Global site tag (gtag.js) - Google Analytics