Java枚举类型的理解和学习


=Start=

缘由:

不断补充学习Java基础知识。

正文:

参考解答:

枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。

一、在没有枚举类型时定义常量常见的方式

public class DayDemo {
    public static final int MONDAY = 1;
    public static final int TUESDAY = 2;
    public static final int WEDNESDAY = 3;
    public static final int THURSDAY = 4;
    public static final int FRIDAY = 5;
    public static final int SATURDAY = 6;
    public static final int SUNDAY = 7;
}

存在的问题:

  • 类型安全问题;
  • 程序可读问题;

二、有了枚举类型之后的定义方式

//枚举类型,使用关键字enum
enum Day {
    MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

三、枚举的常见方法

  • values() : 返回enum实例的数组,而且该数组中的元素严格保持在enum中声明时的顺序。
  • name() : 返回实例名。
  • ordinal() : 返回实例声明时的次序,从0开始。
  • getDeclaringClass() : 返回实例所属的enum类型。
  • equals() : 判断是否为同一个对象。

四、一些示例代码

package com.ixyzero.learn.misc;

public enum LogType {
    SDK_LOG("sdk_log", "log.sdk_log"),
    WEB_LOG("web_log", "log.web_log"),
    OP1_LOG("op1_log", "log.op1_log");

    private String code;
    private String desc;

    // 构造方法:enum的构造方法只能被声明为 private权限 或 不声明权限
    LogType(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public String getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }
}

&

package com.ixyzero.learn.misc;

public class TestEnum {
    public static void main(String[] args) {
        System.out.println(LogType.SDK_LOG); // SDK_LOG
        System.out.println(LogType.SDK_LOG.name()); // SDK_LOG
        System.out.println(LogType.SDK_LOG.getCode()); // sdk_log
        System.out.println(LogType.SDK_LOG.getDesc()); // log.sdk_log

        for (LogType aType: LogType.values()) {
            System.out.print(aType.ordinal());
            System.out.print("\t");
            System.out.print(aType.name());
            System.out.print("\t");
            System.out.print(aType.getCode());
            System.out.print("\t");
            System.out.println(aType.getDesc());
        }

        //直接引用
        Day day = Day.MONDAY;
        System.out.println(day); // MONDAY
        System.out.println(day.ordinal()); // 0

        System.out.println(Day.THURSDAY); // THURSDAY
        System.out.println(Day.THURSDAY.name()); // THURSDAY
        System.out.println(Day.THURSDAY.ordinal()); // 3
    }
}

//定义枚举类型
enum Day {
    MONDAY, TUESDAY, WEDNESDAY,
    THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

&

package com.ixyzero.learn.misc;

enum Season {
    SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);

    private int code;
    Season(int code){
        this.code = code;
    }

    public int getCode(){
        return code;
    }
}
public class EnumSwitch {
    /**
     * 将英文的季节转换成中文季节
     * @param season
     * @return
     */
    public String getChineseSeason(Season season){
        StringBuffer result = new StringBuffer();
        switch(season){
            case SPRING :
                result.append("[中文:春天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
                break;
            case AUTUMN :
                result.append("[中文:秋天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
                break;
            case SUMMER :
                result.append("[中文:夏天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
                break;
            case WINTER :
                result.append("[中文:冬天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");
                break;
            default :
                result.append("地球没有的季节 " + season.name());
                break;
        }
        return result.toString();
    }

    public void doSomething(){
        for(Season s : Season.values()){
            System.out.println(getChineseSeason(s));//这是正常的场景
        }
        // 此处已经是编译不通过了,这就保证了类型安全
        // System.out.println(getChineseSeason(5));
    }

    public static void main(String[] arg){
        EnumSwitch enumSwitch = new EnumSwitch();
        enumSwitch.doSomething();
    }
}

 

参考链接:

=END=

,

《“Java枚举类型的理解和学习”》 有 1 条评论

  1. 答应我,别再if/else走天下了可以吗
    https://mp.weixin.qq.com/s/ufRf8DQQRYQI0q2VxG3hQg
    `
    这样当系统里有几十个角色时,那几十个 if/else嵌套可以说是非常酸爽了…… 这样一来非常不优雅,别人阅读起来很费劲;二来则是以后如果再复杂一点,或者想要再加条件的话不好扩展;而且代码一改,以前的老功能肯定还得重测,岂不疯了……

    所以,如果在不看下文的情况下,你一般会如何去对付这些令人头痛的if/else语句呢?

    当然有人会说用 switch/case来写是否会优雅一些呢?答案是:毛区别都没有!

    # 有枚举为啥不用
    # 有工厂模式为啥不用
    # 有策略模式为啥不用

    本文仅仅是抛砖引玉,使用了一个极其简单的示例来打了个样,然而其思想可以广泛地应用于实际复杂的业务和场景,思想真的很重要!写代码前还是得多思考一番,考虑是否有更具可扩展性的写法!
    `

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注