Java基础(一)妙用枚举类

来源:互联网 发布:珠宝设计软件培训 编辑:程序博客网 时间:2024/05/21 06:22

JDK1.5以后,Java中多了一个Enum关键字,用来定义枚举类型。而在JDK1.5之前,人们都是手动来创建枚举。

首先,我们要知道什么是枚举?

顾名思义,枚举,就是将所需要的一个一个列出来。在创建枚举类时,我们必须手动指定它包含的所有对象。


那什么情况我们会使用枚举类型呢?

一般的数据,我们都会存储在关系型数据库中;图片多的话,有专门的图片服务器;日志、及时性高的数据,我们会存在NoSQL中;海量的数据,我们会想办法,将数据存在分布式数据库中。

而对于一些有特点的信息,我们无需将它们存储在数据库里面,我们会选择将它们用枚举类来进行表示。诸如数据字典、产品类别常量等等。

这些的特点就是:每个数据项目个数、取值都十分稳定。


枚举类的使用非常简单,下面我们来看枚举类常用的集中用法:


1、最简单的枚举类

public enum Gender {MALE,FEMALE;}


上面就是一个关于性别的简单的枚举类,而 `MALE` 和 `MEFMLE` 是Gender枚举类的两个对象实例。这也是枚举类的规定,必须将枚举类的对象实例,列在枚举类里面。我们程序员需要做的就是将实例列出来。

而实际上,JVM会默认每个对象使用public static final 关键字来修饰。也就是说上面的代码等价于:“public static final Gender MALE = new Gender();public static final Gender FEMALE = new Gender();”。

之所以设置为final的,是因为我们不希望枚举类的对象发生改变;使用static修饰,也无可非议,因为我们希望枚举类的对象是类的属性。

我们已经知道,所有属性都是用了final修饰符来修饰,那么我们必须在构造函数中、或者定义时、或者初始化块中指定初始值,但是通常情况下,我们都习惯在构造函数里面为对象赋值。

上面的例子,因为对所属的对象还没有赋值,所以需要完善后,才能使用。我们来看下面的例子:



2、比较常用的枚举类

public enum Gender {MALE("1","男"),FEMALE("0","女");private String code;private String desc;private Gender(String code,String desc){this.code = code;this.desc = desc;}public static Gender getEnumByCode(String code){for (Gender item : Gender.values()) {if (item.getCode()==code) {return item;}}return null;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}}

上面这种用法,大家应该都知道,既然 `MALE` 和 `MEFMLE` 都是对象,那么 `MALE` 和 `MEFMLE`后面的括号应该是构造函数。观察后不难发现,该类中确实存在一个 包含两个参数的Gender的构造函数。

不难发现,上面的例子存在一个问题:我们可以改变枚举类对象的值。原因很简单:尽管枚举类对象被final修饰,但是final关键字对于引用类型来说,只能保证引用地址不变,而对象的属性值是可以变话的。既会下面的情况,下面代码运行结果会是:男。

public static void main(String[] args) {Gender.MALE.setCode("2");System.out.println(Gender.getEnumByCode("2").getDesc());;}


可想而知,这样的枚举在使用是,是不合规矩的,我们最好将枚举类设置成不可变类。所以,我们还需要对这个例子进行改进:


3、最常用的枚举类

最起码,下面这种 是我最个人最喜欢用的一种:

将属性定义成final类型的,说明属性值是不可改变的,然后在构造函数中为对象赋值。这个枚举类变成了一个不可变类,它的属性不应该改变,这样会更加安全,代码更加简洁。

public enum Gender {MALE("1","男"),FEMALE("0","女");private final String code;private final String desc;private Gender(String code,String desc){this.code = code;this.desc = desc;}public static Gender getEnumByCode(String code){for (Gender item : Gender.values()) {if (item.getCode()==code) {return item;}}return null;}public String getCode() {return code;}public String getDesc() {return desc;}}


除此之外,枚举类还有一些用法,比如枚举类可以实现接口,枚举类可以包含抽象方法,这里就不过多讨论了。
通过这里的讲解,我们已经能够对枚举类轻车驾熟了。有需要用到的话,自己再去找资料也不晚。


0 0
原创粉丝点击