出现的原因:
为了代替静态常量。
常量的弊端
- 常量必须定义类型,而如果定义了类型就不明确它定义的意义
- 命名非常局限,严格按照java的命名规范的话。需要加前缀或者后缀,如果不加再次看到就很难懂得自己定义的这个变量是干什么的。 (比如提示自己这个常量是什么)
出现时在java5以后才出现的,于class、interface关键字是平级的。用来定义枚举类,既然类就可以有成员变量和成员方法,也可以实现接口。一个java文件有且只能有一个public修饰的类名
理解枚举类型
枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。
枚举实现原理
使用关键字enum创建枚举类型并编译后,编译器会为我们生成一个类,这个类继承了Java API中的java.lang.Enum类,也就是说通过关键字enum创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum类。
枚举的特点:
1:函数一定是私有的,也就是说这个类不能再其他类中创建对象,
2:枚举中必需有常量,否则构造函数不能创建
3:枚举中可以有静态方法
4:枚举中可以有成员变量
- 可实现接口。默认的继承java.lang.Enum类而不是继承Object,所有他不能直接的继承其他父类,父类实现了Serializable和comparable接口
- 非抽象的枚举类不能派生子类。默认为final修饰。抽象的可以派生子类。(如何为抽象的,类中有未实现的方法就称之为抽象的枚举类)
- 枚举类的构造器只能用private修饰。(不能new对象)写于不写都只能是private修饰
- 所有的枚举实列必须出现在该类的第一行,否则报错
默认为public static final修饰
定义枚举值
所有可能出现的值(星期枚举类,星期一-------星期日都定义),声明是用”,”间隔,声明结束后用”;”结尾
错误的
5、 不能重写equals方法和hashCode方法,为final修饰
6、 如果构造器为有参构造,必须给枚举值一个对应类型的默认值。
多个参数是用”,”隔开。调用构造器了
主要方法
类名.枚举值 获取该枚举值,必须要有变量接受。返回值为该枚举值的类
name() 返回该枚举值所对应的String对象。(toString()相同)
ordinal() 返回该枚举值的索引,索引为定义是的顺序
static values() 返回此枚举类中所有的枚举值组成的数组
枚举缺点 :
1Enum 需要占用较大的内存,如果对内存敏感,请尽量少使用 Enum,换用做静态常量。
(反正Android官网不建议使用enums)
五、总结
不可否认enums会使得代码更易读更安全,但是在编写高效Android代码时避免使用枚举,我们在很多经典的Java书已经看到推荐使用枚举来代替int常量了,但是在Android开发中我不建议使用枚举,特别是大型的App中,能不用则不用。因为它会牺牲执行的速度和并大幅增加文件体积。这也是性能优化中减少OOM的一个方面。