Enum类的介绍和使用

作者: MrHamster 来源:blog.csdn.net 更新时间:2023-05-25 21:55

首先,我们总结一下枚举类的好处,再一层层去研究枚举类的用法:

好处1:如果使用static final属性而不使用枚举的话,可能在代码中出现强行去set属性的写法,在这里单独提出来,大家肯定会觉得不会发生这样的问题,现实开发中,是可能出现的,这时候就会报错,如果使用枚举类的话,因为枚举类无法通过外部去set,所以可以杜绝这样的情况。

好处2:static final扩展性较差,枚举的每一个属性我们都可以扩展属性,重写方法等等。

好处3:可以通过switch去判断,代码的简洁性更高

使用:

最最最最简单级:

先简单写一个枚举类,用enum做关键字声明这个类,然后写属性,注意这里要大写,之间用逗号隔开,这里如果后面没有内容,最后面的分号是可以不加的,但是我们统一规范,加上这个分号。

public enum Number {
	ONE,TWO,THREE,FOUR;
}

然后我们写一个测试类

@Test
public void test01() {
	Number one = Number.ONE;
}

这里我们看出,直接枚举类.属性就可以使用,我们这里需要注意一个细节,返回值是一个类,所以我们上面说的所有枚举类的属性都是错误的说法,实际上它是一个类,一个Number类,也就我们在枚举类里面其实是定义了一个又一个的新类。

简单级:

我们得到了一个Number类,我们自然就会去想着,调用一下它的方法:
在这里插入图片描述
一眼看过去,大多数都是我们熟悉的,除了三个方法,name(),ordinal(),compareTo()。我们没有主动定义过他们。感兴趣的可以深究一下源码,这里直接就说结论了。

public void test01() {
		//name就是枚举类里面定义的属性的名称
		System.out.println(Number.ONE.name()); //ONE
		System.out.println(Number.TWO.name()); //TWO
		//ordinal就是枚举类里面对应属性的位置,排在第几位,从0开始
		System.out.println(Number.ONE.ordinal()); // 0
		System.out.println(Number.THREE.ordinal()); //2
		// compareTo 就是用前面的一个枚举的ordinal去减后面的ordinal
		System.out.println(Number.ONE.compareTo(Number.ONE)); // 0 
		System.out.println(Number.ONE.compareTo(Number.THREE)); //-2
		System.out.println(Number.FOUR.compareTo(Number.ONE)); // 3
	}

入门级:

上面我们讲的都是最基本的用法,接下来我们继续研究一下,枚举类的可扩展性。既然我们都知道在枚举类里面,我们其实是定义了一个又一个新的类。类的构造方法有无参和有参,我们只看见了无参,那么可以实现有参构造吗,答案是可以的,这就是枚举的可扩展性之一。一个Number类无法满足我们的需求,有人看不懂大写的单词,有的只会看中文,更有甚者,只认识数字,所以我们需要给他们展示小写的单词,中文和数字。我们来改写一下代码:

public enum Number {
	ONE("one","一",1),
	TWO("two","二",2),
	THREE("three","三",3),
	FOUR("four","四",4);
	
	// 定义示例变量,这个才是Number类里面真正的属性
	private String lowCase;	//小写
	private String chinese; //中文
	private Integer digit; //数字 
	
	//构造函数,这里只能用private修饰
	//注意,这里只能同时存在一种构造函数,因为目前是有参,所以我们得把枚举类,也就是上面的ONE,TWO也改成有参。
	private Number(String lowCase,String chinese,Integer digit) {
		this.lowCase = lowCase;
		this.chinese = chinese;
		this.digit = digit;
	}
	
	//getter/setter
	public String getLowCase() {
		return lowCase;
	}
	public String getChinese() {
		return chinese;
	}
	public Integer getDigit() {
		return digit;
	}
	public void setLowCase(String lowCase) {
		this.lowCase = lowCase;
	}
	public void setChinese(String chinese) {
		this.chinese = chinese;
	}
	public void setDigit(Integer digit) {
		this.digit = digit;
	}
}
 

这样,我们就得到了一个全新的Number枚举类,它具有扩展的属性。我们再来测试一下它扩展后的属性

public void test02() {
		System.out.println(Number.FOUR.name()); //FOUR 没有变
		System.out.println(Number.FOUR.ordinal());// 3 没有变
		System.out.println(Number.ONE.getLowCase()); // 在构造的时候传的值 one
		System.out.println(Number.TWO.getChinese()); // 二
		System.out.println(Number.THREE.getDigit()); // 3
	}

那么枚举类仅仅只能扩展属性吗?并不是,他还能扩展方法,我们只需要定义一个抽象方法即可:

public enum Number {
	ONE("one","一",1){
		@Override
		public String getNextNumber() {
			return "2";
		}
		},
	TWO("two","二",2) {
		@Override
		public String getNextNumber() {
			return "3";
		}
	},
	THREE("three","三",3) {
		@Override
		public String getNextNumber() {
			// TODO Auto-generated method stub
			return "4";
		}
	},
	FOUR("four","四",4) {
		@Override
		public String getNextNumber() {
			// TODO Auto-generated method stub
			return "5";
		}
	};
	
	// 定义示例变量,这个才是Number类里面真正的属性
	private String lowCase;	//小写
	private String chinese; //中文
	private Integer digit; //数字 
	
	//构造函数,这里只能用private修饰
	//注意,这里只能同时存在一种构造函数,因为目前是有参,所以我们得把枚举类,也就是上面的ONE,TWO也改成有参。
	private Number(String lowCase,String chinese,Integer digit) {
		this.lowCase = lowCase;
		this.chinese = chinese;
		this.digit = digit;
	}
	
	//定义一个抽象方法
	public abstract String getNextNumber();
	
	//getter/setter
	public String getLowCase() {
		return lowCase;
	}
	public String getChinese() {
		return chinese;
	}
	public Integer getDigit() {
		return digit;
	}
	public void setLowCase(String lowCase) {
		this.lowCase = lowCase;
	}
	public void setChinese(String chinese) {
		this.chinese = chinese;
	}
	public void setDigit(Integer digit) {
		this.digit = digit;
	}
}

这里我们就不测试了,感兴趣的小伙伴们自己测一下把。

以上就是本篇文章要介绍的东西,基本可以满足日常工作大部分需求了,如果以后有需要,再来做补充。