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

前言

从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 {

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值