【修真院java小课堂】Enum枚举

大家好,我是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免费指导。

快来与我一起学习吧http://www.jnshu.com/login/1/28090500

猜你喜欢

转载自blog.csdn.net/nemo_227/article/details/81836890
今日推荐