java Enum枚举的原理,看编译后的源码

一、java中的枚举Enum是jdk1.5开始引入的一个新的类型,为开发提供了很大的便利。
enum是一个特殊的class,实际上枚举声明定义的类型就是一个类。
比如下面的一个枚举,我们通过反编译工具可以看到编译后的内容:

public enum ColourEnum {

    RED(1, "红色"),
    BLUE(2, "蓝色"),
    BLACK(3, "蓝色");

    // 成员变量
    private int state;
    private String colour;

    // 构造方法
    ColourEnum(int state, String colour){
        this.state = state;
        this.colour = colour;
    }

    // 枚举循环
    public String getColourByState(int state){
        for(ColourEnum e : ColourEnum.values()){
            if(state == e.getState()){
                return e.getColour();
            }
        }
        return null;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public String getColour() {
        return colour;
    }

    public void setColour(String colour) {
        this.colour = colour;
    }
}

使用工具反编译后的内容:

public final class ColourEnum extends Enum
{

	public static final ColourEnum RED;
	public static final ColourEnum BLUE;
	public static final ColourEnum BLACK;
	private int state;
	private String colour;
	private static final ColourEnum $VALUES[];

	public static ColourEnum[] values()
	{
		return (ColourEnum[])$VALUES.clone();
	}

	public static ColourEnum valueOf(String name)
	{
		return (ColourEnum)Enum.valueOf(com/daxitong/service/enums/ColourEnum, name);
	}

	private ColourEnum(String s, int i, int state, String colour)
	{
		super(s, i);
		this.state = state;
		this.colour = colour;
	}

	public String getColourByState(int state)
	{
		ColourEnum acolourenum[] = values();
		int i = acolourenum.length;
		for (int j = 0; j < i; j++)
		{
			ColourEnum e = acolourenum[j];
			if (state == e.getState())
				return e.getColour();
		}

		return null;
	}

	public int getState()
	{
		return state;
	}

	public void setState(int state)
	{
		this.state = state;
	}

	public String getColour()
	{
		return colour;
	}

	public void setColour(String colour)
	{
		this.colour = colour;
	}

	static 
	{
		RED = new ColourEnum("RED", 0, 1, "红色");
		BLUE = new ColourEnum("BLUE", 1, 2, "蓝色");
		BLACK = new ColourEnum("BLACK", 2, 3, "蓝色");
		$VALUES = (new ColourEnum[] {
			RED, BLUE, BLACK
		});
	}
}

通过反编译可以看到其实自定义枚举就是继承了Enum类,然后定义的枚举常量其实就是一个一个对象,在static里面进行了初始化;

二、枚举的好处和特点

  • 1、不能有public构造函数,这样就不能自己new一个Enum实例;
  • 2、所有枚举的值都是public static finel类型的;
  • 3、默认实现了Comparable接口;
  • 4、枚举提供了values方法,这样可以方便遍历所有的枚举值;
  • 5、枚举的出现可以帮助开发者写出更简洁的代码,更通俗易读;

三、枚举可以用来定义常量,而且提供了比常量更多的方法

  • 1、switch用法
public int getColourEnumByState(ColourEnum colourEnum){
        int i = 0;
        switch (colourEnum) {
            case RED :
                i = RED.getState();
                break;
            case BLUE :
                i = BLUE.getState();
                break;
            case BLACK :
                i = BLACK.getState();
                break;
        }
        return i;
    }
  • 2、for循环用法
public String getColourByState(int state){
        for(ColourEnum e : ColourEnum.values()){
            if(state == e.getState()){
                return e.getColour();
            }
        }
        return null;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值