枚举的底层实现

         先来一段源码:

public enum WeekDay {
	
	MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
	
}

        再来看一下这段源码的底层实现(反编译结果):

public final class WeekDay extends Enum
{

	public static final WeekDay MONDAY;
	public static final WeekDay TUESDAY;
	public static final WeekDay WEDNESDAY;
	public static final WeekDay THURSDAY;
	public static final WeekDay FRIDAY;
	public static final WeekDay SATURDAY;
	public static final WeekDay SUNDAY;
	private static final WeekDay ENUM$VALUES[];

	private WeekDay(String s, int i)
	{
		super(s, i);
	}

	public static WeekDay[] values()
	{
		WeekDay aweekday[];
		int i;
		WeekDay aweekday1[];
		System.arraycopy(aweekday = ENUM$VALUES, 0, aweekday1 = new WeekDay[i = aweekday.length], 0, i);
		return aweekday1;
	}

	public static WeekDay valueOf(String s)
	{
		return (WeekDay)Enum.valueOf(note/WeekDay, s);
	}

	static 
	{
		MONDAY = new WeekDay("MONDAY", 0);
		TUESDAY = new WeekDay("TUESDAY", 1);
		WEDNESDAY = new WeekDay("WEDNESDAY", 2);
		THURSDAY = new WeekDay("THURSDAY", 3);
		FRIDAY = new WeekDay("FRIDAY", 4);
		SATURDAY = new WeekDay("SATURDAY", 5);
		SUNDAY = new WeekDay("SUNDAY", 6);
		ENUM$VALUES = (new WeekDay[] {
			MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
		});
	}
}

        首先,枚举类隐式继承了Enum,Enum是所有java语言枚举类型的公共基类,包含一个valueOf方法,这个方法上边的源码中是有具体实现的

        我们自己定义的属性被自动转换为静态常量,通过静态代码块(最高优先级)完成了静态final的二次赋值,并为他们设置了下标,在swith中传入枚举参数,实际上判断的就是这些下标!(0,1,2,...)

        同时枚举类将用户定义的所有属性封装为了一个本类类型的数组,调用values方法可以获取这个数组,但是在JDK的API里,是没有这个方法的,这个方法只有看了底层源码才会了解,同时这个方法返回的不是本类的原生数组,而是复制版

        另外可以看到这个枚举为饿汉式的单例设计模式,那这就有意思了,因为我们可以来个枚举单例:


//枚举单例(最简单):

public enum Demo{
	INSTANCE
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值