育儿奶爸
认识枚举
枚举就是要让某个类型的变量的取值只能为若干个固定值中的一个,否则编译器就会报错,枚举可以让编译器在编译时就可以控制源程序赋给的非法值,使用普通变量的方式在开发阶段无法实现这一目标.
在JDK1.5之后,使用关键字enum定义一种新的类型,称为枚举类型。
JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象作为表达式, case 子句可以直接使用枚举值的名字, 无需添加枚举类作为限定
枚举的定义
枚举的类名建议带上Enum后缀,枚举成员需要全大写,单词间用下划线隔开。
枚举其实是特殊的常量类,且构造方法被默认的强制私有。
正确的命名方式为:
ResultEnum的成员名称为: SUCCESS / UNKNOWN_REASON。
定义规则如下:
私有化类的构造器。
成员变量如果声明为final。要在构造器中初始化,不允许被修改、
通过公共方法 调用属性。
枚举实例必须在前面
需要在枚举实例后面加上分号,然后再写构造函数等。
枚举类默认提供了values()方法,该方法可以很方便得遍历所有的枚举值
枚举类对象可以有属性
若枚举类显式的定义了带参数的构造器, 则在列出枚举值时也必须对应的传入参数
Enum类 与 enum关键字
使用enum 关键字定义的枚举类,实际上就想当于定义了一个类,此类继承了Enum类而已。E
集合对枚举的支持
集合对枚举的支持,对于Set和Map接口而言又增加了两个新的子类: EnumSet 、EnumMap两个类:
enum 类基本用法
我们可以定义一个颜色的枚举:
怎么调用呢,Java switch语句参数就支持enum类
带构造方法的枚举
定义规则:
私有化类的构造器
枚举实例必须在前面
需要在枚举实例后面加上分号,然后再写构造函数等
让枚举实现接口
枚举类可以实现一个或多个接口。与普通类实现接口完全一样,枚举类实现接口时,需要实现该接口所包含的方法。
如果需要每个枚举值在调用同一个方法时呈现不同的行为,则可以让每个枚举值在{...}匿名块中实现自己的业务逻辑
在枚举中定义抽象方法
enum类是很特殊的一个类,实际上它是一个抽象类。枚举中可以用抽象方法,但是枚举中的每一个对象都分别实现抽象方法;
枚举实现单例类
1、借助JDK1.5添加的枚举来实现单例模式。不仅能够避免多线程同步问题,而且还能防止反序列化重新创建新的对象.
2、这种方式是Effective Java 作者 Josh Bloch 提倡的方式
enum类和常量的区别
这种方式在使用上跟枚举没有却别,但是我们为什么选择枚举呢?
(1) 、类型不安全: 因为上面的每个颜色实际上时一个int 整数,因此完全可以把一个颜色当成一个int整数使用,例如进行加法运算RED+ GREEN,这样代码完全正常
(2) 、 没有命名空间: 当需要使用颜色时,必须在前面加上COLOR_前缀,否则程序可能与其他类中的静态常量混淆
。(3) 、 打印输出的意义不明确:当输出某个季节时,例如输出COLOR_RED,实际 上输出的是1,这个1很难猜测它代表了红色.
(4) 不容易扩展,每一个key对应一个值,
枚举类与普通类区别
使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
- 枚举类的构造器只能使用 private 访问控制符
- 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾). 列出的实例系统会自动添加 public static final 修饰
Enum枚举类主要方法
values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
- valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常。
码农的一天
枚举在日常生活中很常见。例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY, 就是一个枚举,有且只有这七个常量。
枚举或者对应的静态变量方式,最最最常用的地方,就是用于分类的选择。而使用哪种,取决于是否要将分类对应的值存入数据库。 比如你的分类1,分类2,分类3对应了1, 2,3,你要随其他参数保存进数据库的,这时候就没必要用枚举了,枚举也能做,但多此一举。 而那些不需要存入数据库,仅在代码逻辑中出现的分类区别的逻辑,就可以大大方方的用枚举。显得还专业。
一句话说,枚举是一组常量值。
那么我来举个例子
如public enum ColorEnum {
red,
green,
yellow,
blue; }
这排版太难了,我就这样吧。
1、那么调用方法 public void method(ColorEnum enum) { } 时只能传递red,green,...四个值中的一个,否则编译会出错,这对于用户编程而言是安全的
2、枚举类型相对与常量类型拥有更好的可读性,通过字面意思即可知道
3、枚举类型提供很多方法可以方便的操作,例如迭代查找等,同时枚举还有较高的运行的效率
4、在程序写1,看代码的时候,不知道这个1代码什么意思。 一般的静态变量实际上也是一个值,定义个名称,能够从字面上理解代码的意思和作用。
Java进阶架构师
Java中的枚举类型是一种类型,其值由一组固定的常量组成。这听起来很理论化,所以让我们尝试用非正式的方式来描述它们。在Java中,枚举类型是具有预定义实例集的类。这与C#完全不同,其中枚举是一种更简单的类型。在Java中,枚举可以有构造函数,方法,字段......它们实际上就像类,只有一些特定的差异:
- 枚举是隐式的类的最终子类
- 如果一个枚举是一个类的成员,那就是隐含的
- 关键字不能用于初始化枚举,即使在枚举类型本身内也是如此
- 和方法只是使用枚举常量的文本,而如果需要,可以重写方法以提供任何内容
- 对于枚举常量,并评估相同的结果,并可以互换使用
- 枚举常量是隐含的
- 该枚举常数的列表的出现顺序被称为其“ 自然顺序 “,并且定义使用的其它项目以及顺序:方法,迭代顺序中的值,。
- 枚举构造函数应声明为。编译器允许非私有构造函数,但这似乎误导了读者,因为new永远不能与枚举类型一起使用。
- 由于这些枚举实例都是有效的单例,因此可以使用identity()比较它们的相等性。
- 你可以在switch语句中使用enum,比如int或char原始数据类型
三僡然
枚举类型的本质是个整数。它的作用是为了程序的可读性。
重庆叶宏
好像在后端开发推荐用枚举 而在安卓开发的时候因为枚举会比正常接口常量大很多字节 所以谷歌不建议在安卓上使用枚举 用接口常量来替代吧
神锋触怒
可以理解为下拉框里的选项,让阅读或使用你代码的人知道某个地方都有哪些可能性。
作为一个常用于给对象“做类别标记”的值,比用数字可读性好,比用字符串性能好,比判断数字常量约束性强且不需要自己确保数值唯一,enum对反射支持更多,EnumSet可以很高性能地交、并运算。
TwilightSun
说简单点,枚举就是定义某一类就只有固定的几个事物,如定义方向只有东、南、西、北、东北、西北、东南、西南这八种,没有第九种方向。其它的语言也支持枚举类型。