您的位置:首页 > 编程语言 > Java开发

【枚举高阶】Java中枚举的本质是什么

2018-01-16 09:48 281 查看

前言

从2013年开始接触SSH开发到现在,期间基本没有用过Java的Enum,直到最近有新项目,代码中大量使用Enum,才开始了解java中的Enum。其实Enum的本质,和之前用得很多的static类成员是一样的,不过更直观,易用。老代码中继续使用static类,其中一个原因是兼容jdk1.5之前的代码。

Java中枚举的特性

01.Enum不可以有public或者protected的构造方法,只能是private或friendly(就前面不用修饰符),这样可以保证客户代码不能新建一个Enum的实例,我们也不需要实例化Enum对象。

02.Enum的枚举值都是public static final(非枚举值可以不是)

03.Enum默认实现了java.lang.Comparable接口

04.Enum重写了toString()

05.Enum提供valueOf(),这个方法与toString相对应,因此重写toString(),一定要重写valueOf()

06.Enum提供values()可以遍历枚举值 返回的就像ArrayList的对象,然后我们可以这样遍历每个枚举值

07.Enum的长度values().length

08.Enum提供oridinal()可以返回枚举值顺序

枚举特性背后的原理

下面是一个Color枚举类型编译后的代码,可以看到,枚举的本质就是静态类中带静态变量,这和之前的工程中常见的代码是一样的,很多老旧工程中继续使用静态类,可能是延续java1.5以前的常规做法,积重难返。

Compiled from "Color.java"
public final class Color extends java.lang.Enum<Color> {
public static final Color RED;
public static final Color BLUE;
public static final Color BLACK;
public static final Color YELLOW;
public static final Color GREEN;
public static Color[] values();
public static Color valueOf(java.lang.String);
static {};
}


一,enum类型是一个不可以被继承的final类。其枚举值都是Color类型的类静态常量(这也是为什么enum会大写的原因)。

二, 既然是类,所以enum类型也有构造函数,方法和域。

但是枚举还是有自己的特殊性:

enum Color{
RED(255, 0, 0), BLUE(0, 255, 0), GREEN(0, 0, 255);//注意此处必须有分号

private Color(int r, int g, int b){
this.r = r;
this.g = g;
this.b = b;
}

private int r, g, b;

public String toString(){
return super.toString() + "(" + r + ", " + g + ", " + b + ")";
}
}


(1) 枚举的构造函数只有在构造枚举值时被调用

(2) 为了确保构造函数不会被外部调用,因此构造函数必须是private的。

(3) 所有enum类型都会继承Enum.java的方法,包括:

a. ordinal()方法:返回枚举值在enum类中的顺序。这个顺序依据枚举值声明时的顺序而定。

    Color.RED.oridinal(); //返回结果:0

b. compareTo()方法:

    Color.RED.compareTo(Color.BLUE); //返回结果:-1

c. toString():返回枚举值的名称

    Color.RED.toString(); //返回结果:RED

d. values():返回一个包含全部枚举值的数组

    Color[] colors = Color.values();

e. valueOf():返回枚举值常量

    Color.valueOf(“BLUE”); //返回结果:Color.BLUE

d. equals() : 比较两个枚举类对象的引用。

public final boolean equals(Object other){
return this == other;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: