目录
5)values与valueof(String name)方法
一、引用的资料
Java 中如何使用枚举来消除 if/else_java 使用枚举优化if-CSDN博客
另外的为别人专拦不好挂链接
二、枚举的概念
1)枚举的定义
枚举是Java 1.5加入的新特性,是一种特别的操作受限的类型,与Java的class,interface,annotation同级别的类型。它需要将所有的定义在枚举类型中列出来,枚举的创建的对象全是单例的。
而在java1.6中加入了在switch中使用枚举。另外枚举是Enum的隐式子类。
2)为什么使用枚举
对于性别,有限的类别等,很多都会使用常量来定义,如下:
但是这一种在使用时,setType,放入数字,可读性差,所以一般是Entity.TEXT这样使用。但是仍然是可以用数字的,且容易越界即插入非规范好的数字。同时如果要对这个进行修改或添加也是一件很容易出问题的事。
即存在
1,可读性,易用性差等问题。上面的要可读得进入entity类里面,且要做额外的约束。
2,安全性差,很有可能插入越界的数据。如上面的插入-1,5等
3,可扩展性,可维护性差,要添加新的类型需要改变的地方多。
而用枚举可以解决上面的问题。
三、枚举的使用
1)普通使用
如下:
public enum TypeEnum {
VIDEO,AUDIO,TEXT,IMAGE;
}
没有方法与属性。每一个定义的对象用","隔开。最后以";"结尾(如果后面没有定义方法与属性等,可以不加)。
2)有方法与属性
带方法与属性需要构建相应的构造器,因为不允许外部创建新的枚举对象。
枚举的构造器默认是private的,且只能是private的,不能明写为protected和public,但是枚举的方法与属性是可以标记为public等的,为了使用安全需要注意开放的方法与属性,防止被缀改导致问题。
public enum TypeEnum {
VIDEO(1), AUDIO(2), TEXT(3), IMAGE(4);
int value;
TypeEnum(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
一个使用例子:
3)重写方法与实现接口
枚举因为是Enum的隐式子类,不能再继承别的类,但是可以实现别的接口。
同时也可以重写Enum的方法,以及Object的方法。
4)swtich用法
5)values与valueof(String name)方法
values0),valueof(stringname)方法
每个枚举类都有两个static方法
static direction values():返回本类所有枚举常量(返回的是对象数组 )
static direction valueOf(String name):通过枚举常量的名字返回directon常量,注慧,这个方法与enum
类中的valueOf(String)方法的参数个数不同。
values一般用于遍历查找枚举对象。
valueof()查找单个对象,且名称必须与定义的枚举对象名一致。如:
6)注意事项
1,枚举是Enum的隐式子类,不能再额外继承别的类
2,枚举所有的构造器是private的,防止外部创建对象(枚举的特性就是有穷的对象)。
3,枚举的方法与属性是可以非private的,要注意权限的开放。
4,枚举的values与valueOf(String name)方法
四、枚举与策略模式
枚举也是一种可以实现策略模式的方式,但每添加一条策略就需要维护枚举类型并不优雅。
在spring系列的框架中,更推荐如下:
@Autowired
private Map<String, DemoService> serviceMap;
要求key必须为String的,上面的key 为Beanid,后面的为ioc管理的实例。