Java SE 5中引入了全新的枚举(Enum)概念,个人认为十分有用,整理一些相关概念和基本用法。
1.1:枚举的概念
枚举,即枚举类,准确的说枚举即是一个类。使用关键字enum+类名声明一个枚举类,然后将一组具名的值的有限集合封装起来,创建为一种新的类型。
根据上述定义,我们可以知道枚举的一般性特性,即枚举中的数据是具名的,数据的数量是有限且固定的(即不是动态的),必须将这些数据封装在枚举类中。枚举类中的具名数据的名称采用常量的形式封装若干个该类的实例,并且每个实例可以扩展若干属于该实例的数据,这个数据类型支持基本类型和引用类型。这里要注意的是,枚举类中的数据仅仅是以常量的形式由编译器进行封装,而并非是真正意义上的常量,它们都是该枚举类的一个实例。由于是以常量的形式来组织并封装数据,故而枚举可以很好的与switch/case组合配合来完成判断条件必须为引用数据类型的流程控制编码,尤其是数据量较大时,这一点十分方便,并能有限增强代码的层次感和可读性,突破了switch/case流程中只能使用整数和char类型的限制。枚举类类似于实体类,它们都是在一个类中封装数据,并提供取值和设置的方法,但枚举类的构造方法只能是私有的,通过getter和setter方法来操纵数据,构造方法仅仅用于编译器自行构造数据,也就是说枚举类创建实例的过程由编译器自动完成。
1.2:应用场景与基本用法
目前建立在我个人对枚举类的理解和应用的基础上,是认为枚举类较多的应用场景在于我们工程中需要封装一个具名有限序列之处,通俗的说即是很多时候我们会创建一个类,在类中声明一些应用于全局或某模块的静态常量数据,例如Android工程中通常会将全部的请求URL以静态常量的方式全部封装在一个类中,然后通过类名.变量名来调用。此处我认为用枚举类来替代静态常量是一个明智的选择,依据有二:一是静态数据占用的是独立的静态内存,java的垃圾收回机制通常不会回收并释放这些内容占用,而枚举类中的数据都是该类的实例,也就是类对象,在java自动垃圾回收的范围之类,性能要优于静态常量;二是即是静态数据,我们肯定希望该数据可以共享,枚举同样已经实现,它的每一个实例由编译器自动创建,且构造方法必须是私有的,也就是枚举类的每个实例是唯一的,这与静态数据也并没有什么区别,并且它也可以在枚举类的内部封装setter方法,同样可以改变该实例的数据,如果需要枚举是常量,那么不提供setter方法可实现同样的效果。
基本用法示例:
package enumdemo;
public enum Color
{
//枚举类以常量的形式封装数据,所以它的实例名称采用全部大写
RED(1, "red"), BLUE(2, "blue"), BLACK(3, "black");
/*
* 封装2个数据,对应每个实例中的数据
*/
private int mKey;
private String mValue;
/*
* 构造方法必须是私有的,供编译器构造每个实例的数据
*/
private Color(int mKey, String mValue)
{
this.mKey = mKey;
this.mValue = mValue;
}
/*
* getter、setter方法,需要通过每个实例去调用
*/
public int getmKey()
{
return mKey;
}
public void setmKey(int mKey)
{
this.mKey = mKey;
}
public String getmValue()
{
return mValue;
}
public void setmValue(String mValue)
{
this.mValue = mValue;
}
}
package enumdemo;
public class EnumDemo
{
public static void main(String[] args)
{
// // output:1 red
System.out.println(Color.RED.getmKey() + " " + Color.RED.getmValue());
/*
* 枚举类可以作为switch/case的判断条件
*/
switch (Color.RED.getmValue())
{
case "red":
// output:1
System.out.println(1);
break;
default:
break;
}
// 枚举类的数据拼接。output:1 blue
System.out.println(Color.RED.getmKey() + Color.BLUE.getmValue());
}
/*
* 枚举是一个类,也可以以内部类的形式在另一个类中创建
*/
enum Color2
{
// create enum
}
}
(此文原创,纯手工!)