从设计角度,深入理解枚举类

文章目录

前言

一、枚举类是什么?

二、为什么会有枚举类?

1.枚举类出现之前

2.枚举类出现之后

3.为什么要使用枚举类?

4.操作枚举类型成员的方法

总结


前言

枚举是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()

总结

本文章主要从代码设计的角度来谈使用枚举类的优点,和介绍了枚举类型的成员方法。下一篇文章中,我将介绍使用枚举类实现工厂方法,如何编写高质量代码,我们正在路上。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值