文章目录
前言
枚举是java5中提出的新概念,但是到现在也有很多人不懂这个枚举,或者不习惯写枚举类。可能是由于在1.5之前有其他替代方案吧。但是对于我这种设计洁癖的人来说新东西、好东西不用真是浑身难受。
一、枚举类是什么?
枚举可以根据Integer、Long、Short或Byte中的任意一种数据类型来创建一种新型变量。有效地防止用户提供无效值。该变量可使代码更加清晰,在我理解枚举类是一种包含多个关联对象特殊的类。它一样有自己的属性、方法,也可以定义自己的构造器。
二、为什么会有枚举类?
1.枚举类出现之前
列举对象一般都是使用static和final来实现的
package model;
public class FileType{
public static final FileType pdf=new FileType(1);
public static final FileType doc=new FileType(2);
private int type;
private FileType (int type){
this.type=type;
}
public String getType() {
return type;
}
public void setType(int type) {
this.type= type;
}
}
如果每次列举一个对象都要去创建一个static final对象,这就很麻烦,所以枚举类就诞生了。
2.枚举类出现之后
public enum FileTypeEnum {
/**
* pdf
*/
PDF(1),
/**
* doc
*/
DOC(2),
/**
* 类型
*/
private int type;
FileTypeEnum(int type) {
this.type = type;
}
public int getType() {
return type;
}
public static FileTypeEnum getFileTypeEnum(int type) {
FileTypeEnum fileTypeEnum = null;
for (FileTypeEnum fileType : FileTypeEnum.values()) {
if (fileType.getType() == type) {
fileTypeEnum = fileType;
break;
}
}
return fileTypeEnum;
}
}
再搭配switch case用法,不仅少了影响代码美观的if...else,并且代码让人一目了然,可读性大大提高。使用枚举类就不用再去一个个地敲static final了。
// 获取文件类型
FileTypeEnum fileTypeEnum = FileTypeEnum.getFileTypeEnum(2);
switch (fileTypeEnum) {
case PDF:
//...具体业务逻辑
break;
case DOC:
//...具体业务逻辑
break;
default:
break;
}
3.为什么要使用枚举类?
那么既然有了常量了,还要需用枚举类呢?
答:比如像上面的代码一样,你定义一个方法用来接收文件后缀的类型,然后根据不同的数值执行不同的逻辑,如果只是用常量,此时你会发现你没办法限制调用者传什么值进来,他可以按照常量的范围传递1,2也可以传递4,5,最主要的你没有办法让调用者直观感受应该传什么值。毕竟你的参数只是int类型,代表只要传递int数值就是合法的。当然你可以加注释或者对数字做一些逻辑,但这不是一个好的设计。通过枚举类,我们可以为了更好的限制调用者。
以上是我从设计的角度来思考使用枚举类的必要性,但还有其他许多优点这次不加赘述。
4.操作枚举类型成员的方法
就如上面我贴的代码中,使用到了枚举类.values()方法,该方法是以数组形式返回所有枚举成员,其他枚举成员方法具体如下图所示
方法名称 | 具体含义 | 使用方法 |
values() | 将枚举类型成员以数组的形式返回 | 枚举类型名称.values() |
valueOf() | 实现将普通字符串转换为枚举实例 | 枚举类型名称.valueOf(“PDF”) |
compareTo() | 比较两个枚举对象在定义时的顺序 | 枚举对象.compareTo() |
ordinal() | 得到枚举成员的位置索引 | 枚举对象.ordinal() |
总结
本文章主要从代码设计的角度来谈使用枚举类的优点,和介绍了枚举类型的成员方法。下一篇文章中,我将介绍使用枚举类实现工厂方法,如何编写高质量代码,我们正在路上。。。