=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(); } }
参考链接:
- 深入理解Java枚举类型(enum)
- Java 枚举7常见种用法
http://softbeta.iteye.com/blog/1185573 - Java 语言中 Enum 类型的使用介绍
- Java enum的用法详解
- Java枚举详解
- Java的枚举类型用法介绍
- Java 枚举知识整理
- java 枚举类比较是用==还是equals?
- Java 中的枚举 (enum)
=END=
《“Java枚举类型的理解和学习”》 有 1 条评论
答应我,别再if/else走天下了可以吗
https://mp.weixin.qq.com/s/ufRf8DQQRYQI0q2VxG3hQg
`
这样当系统里有几十个角色时,那几十个 if/else嵌套可以说是非常酸爽了…… 这样一来非常不优雅,别人阅读起来很费劲;二来则是以后如果再复杂一点,或者想要再加条件的话不好扩展;而且代码一改,以前的老功能肯定还得重测,岂不疯了……
所以,如果在不看下文的情况下,你一般会如何去对付这些令人头痛的if/else语句呢?
当然有人会说用 switch/case来写是否会优雅一些呢?答案是:毛区别都没有!
# 有枚举为啥不用
# 有工厂模式为啥不用
# 有策略模式为啥不用
本文仅仅是抛砖引玉,使用了一个极其简单的示例来打了个样,然而其思想可以广泛地应用于实际复杂的业务和场景,思想真的很重要!写代码前还是得多思考一番,考虑是否有更具可扩展性的写法!
`