大家好,我是IT修真院西安分院第三期学员,一枚正直纯洁善良的JAVA程序员。
今天给大家分享一下,修真院官网JAVA任务二,扩展思考中的知识点——Enum枚举
一、背景介绍
- 什么是枚举?
枚举是指一组固定常量组成合法值的类型
首先是固定常量,一组有限常量集,比如一年的四个季节,太阳系的行星。其次,枚举是一种特殊的类型,定义了自己的一些规则,这些规则是建立在类规则之上的,是一种 type。
枚举是真正的 final,客户端不允许创建枚举类的实例,也不能对其进行拓展
Java 枚举本质上是 int 值。只能通过公有的静态 final 域为枚举类导出实例。 - 为什么要使用枚举
在程序设计语言中,一般用一个数值来代表某一状态,这种处理方法不直观、易读性差。如果能在程序中用自然语言中有相应含义的单词代表某一状态,则程序就很容易阅读和理解。
枚举在 Java 语言中的作用很大。它可以对类似的相同类型的对象同时进行声明,在程序中调用这些元素时,不会出现混淆和重复。
由于枚举的统一性,使得开发人员编写的代码量大大减少了,同时增加了程序的阅读性和修改性。
二、知识剖析
* 枚举简介
事先考虑到某一变量可能的取值,尽可能用自然语言中含义清楚的单词来表示它的每一个值,这种方法称为枚举方法。用这种方法定义的类型称为枚举类型。Java 中的 Enum 是 JDK1.5 中增加的功能,在 JDK1.5 中和 class 是一个层次的,是一种数据类型。enum 非常像 public static final int 声明,后者作为枚举值已经使用了很多年。对 int 所做的最大也是最明显的改进是类型安全 – 不能错误的用枚举的一种类型代替另一种类型。除去极少数例外的情况,通常都应该用 enum 替换全部枚举风格的 int 接口
三、常见问题
如何使用枚举?
四、解决方案
五、编码实战
/**
* 普通枚举
*
*/
public enum ColorEnum {
red,green,yellow,blue
}
@Test
public void testColorEnum() {
// 枚举是一种类型,用于定义变量,以限制变量的赋值
// 赋值时通过 “枚举名.值” 取得枚举中的值
ColorEnum colorEnum = ColorEnum.red;
switch (colorEnum) {
case red:
System.out.println("Color is red!");
break;
case green:
System.out.println("Color is green!");
break;
case yellow:
System.out.println("Color is yellow!");
break;
case blue:
System.out.println("Color is blue!");
break;
}
// 遍历枚举
System.out.println("ColorEnum 枚举中的值有" + ColorEnum.values().length
+ " 个");
// 获取枚举的索引位置
System.out.println(ColorEnum.red.ordinal());
System.out.println(ColorEnum.green.ordinal());
System.out.println(ColorEnum.yellow.ordinal());
System.out.println(ColorEnum.blue.ordinal());
// 枚举默认实现了 java.lang.Comparable 接口
System.out.println(ColorEnum.red.compareTo(ColorEnum.green));
}
@Test
public void ColorStateTest() {
for(ColorState colorState:ColorState.values()){
System.out.println(colorState);
System.out.println(colorState.getName());
System.out.println(colorState.ordinal());
}
}
六、扩展思考
如何自己实现枚举类
//简单枚举类,不安全
public class SeasonInt {
public static final int SPRING = 0;
public static final int SUMMER = 1;
public static final int AUTUMN = 2;
public static final int WINTER = 3;
}
//安全
public class SeasonSafe {
private final String name;
private SeasonSafe(String name){
this.name = name;
}
public String toString(){
return name;
}
public static final SeasonSafe SPRING = new SeasonSafe("spring");
public static final SeasonSafe SUMMER = new SeasonSafe("summer");
public static final SeasonSafe AUTUMN = new SeasonSafe("autumn");
public static final SeasonSafe WINTER = new SeasonSafe("winter");
}
七、参考文献
Java核心知识卷一
8.更多讨论
1 枚举类能否有自己的方法?
可以。
public enum SeasonEnum {
//注:枚举写在最前面,否则编译出错
spring,summer,autumn,winter;
private final static String position = "test";
public SeasonEnum getSeason(){
if("test".equals(position)){
return spring;
}else{
return winter;
}
}
}
2 怎么去遍历枚举?
@Test
public void ColorStateTest() {
for(ColorState colorState:ColorState.values()){
System.out.println(colorState);
System.out.println(colorState.getName());
System.out.println(colorState.ordinal());
}
}
3 枚举如何实现单例?
enum SingletonDemo{
INSTANCE;
public void otherMethods(){
System.out.println("Something");
}
}
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。