=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来写是否会优雅一些呢?答案是:毛区别都没有!
# 有枚举为啥不用
# 有工厂模式为啥不用
# 有策略模式为啥不用
本文仅仅是抛砖引玉,使用了一个极其简单的示例来打了个样,然而其思想可以广泛地应用于实际复杂的业务和场景,思想真的很重要!写代码前还是得多思考一番,考虑是否有更具可扩展性的写法!
`