java枚举

一、基本概念

1. enum 的全称为 enumeration, 是 JDK 1.5  中引入的新特性,存放在 java.lang 包中 

2. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)

3. 实际上 enum 就是一个 class,只不过 java 编译器帮我们做了语法的解析和编译而已

4. enum 可以像一般类一样实现接口,也可以增加自己的方法

5. enum 不可以继承另外一个类,当然,也不能继承另一个 enum

6. 枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序

	blic enum EnumTest {
	    MON, TUE, WED, THU, FRI, SAT, SUN;
	}

	这段代码实际上调用了7次 Enum(String name, int ordinal):

	new Enum<EnumTest>("MON",0);
	new Enum<EnumTest>("TUE",1);
	new Enum<EnumTest>("WED",2);
	...

二、enum 对象的常用方法

1. int compareTo(E o) 	  	 			比较此枚举与指定对象的顺序

2. Class<E> getDeclaringClass()   		返回与此枚举常量的枚举类型相对应的 Class 对象

3. String name()                        返回此枚举常量的名称,在其枚举声明中对其进行声明

4. int ordinal()                        返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)

5. String toString()                    返回枚举常量的名称,它包含在声明中

6. valueOf       						valueOf()通过常量名获取对应的枚举实例

7. values()								获取存储枚举中所有常量实例的数(常配合foreach完成遍历)

三、枚举的好处以及与常量类的区别

1. switch语句支持枚举型,当switch使用int、String类型时,由于值的不稳定性往往会有越界的现象,对于这个的处理往往只能通过if条件筛选以及default模块来处理。而使用枚举型后,在编译期间限定类型,不允许发生越界的情况

2. 当你使用常量类时,往往得通过equals去判断两者是否相等,使用枚举的话由于常量值地址唯一,可以用==直接对比,性能会有提高

3. 常量类编译时,是直接把常量的值编译到类的二进制代码里,常量的值在升级中变化后,需要重新编译引用常量的类,因为里面存的是旧值。枚举类编译时,没有把常量值编译到代码里,即使常量的值发生变化,也不会影响引用常量的类

4. 枚举类编译后默认为final class,不允许继承可防止被子类修改。常量类可被继承修改、增加字段等,容易导致父类的不兼容

四、代码示例,新增属性以及普通方法

1. 说明
1)需要给枚举新增属性的话,比如三个属性,那么需要在构造方法入参中声明这3个属性值,这个枚举(也是类)声明3个属性,且有get和set方法

2)新增方法的话,如果不是跟某个枚举对象相关的话可以用静态方法,反之就是普通方法
2. 代码示例
1)枚举类

	public enum EnumTest {

	    MON(1, "星期一", "不开心"), TUE(2, "星期二", "煎熬"), WED(3, "星期三", "优点希望了");

	    int index;

	    String name;

	    String heart;

	    EnumTest(int index, String name, String heart){
	        this.index = index;
	        this.name = name;
	        this.heart = heart;
	    }

	    public static void testEnum(){
	        System.out.println("我是一个测试的自定义方法");
	    }

	    public int getIndex() {
	        return index;
	    }

	    public void setIndex(int index) {
	        this.index = index;
	    }

	    public String getName() {
	        return name;
	    }

	    public void setName(String name) {
	        this.name = name;
	    }

	    public String getHeart() {
	        return heart;
	    }

	    public void setHeart(String heart) {
	        this.heart = heart;
	    }
	}

2)测试代码

	public class Test {

	    public static void main(String[] args) {
	    
	        EnumTest test = EnumTest.TUE;

	        System.out.println("test = " + test);

	        switch (test.compareTo(EnumTest.MON)){
	            case -1:
	                System.out.println("TUE 在 MON 之前");
	                break;
	            case 1:
	                System.out.println("TUE 在 MON 之后");
	                break;
	            default:
	                System.out.println("TUE 与 MON 在同一位置");
	                break;
	        }

	        System.out.println("getDeclaringClass(): " + test.getDeclaringClass().getName());

	        System.out.println("name():" + test.name());
	        System.out.println("toString():" + test.toString());

	        System.out.println("ordinal():" + test.ordinal());

	        System.out.println("heart=" + test.getHeart());

	        EnumTest.testEnum();
	    }
	}


参考网址

java enum(枚举)使用详解 + 总结

Java基础——枚举详解(很好的原理理解)

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值