驯服Tiger之深入研究枚举类型
来源:网络 更新时间:2014-12-6
基础知识
在J2SE1.5中通过使用新的enum关键字创建指定的对象集合,您可以创建一个枚举类型。然后,可以将每个指定的值看作是那个类的一个实例,这为您提供了指定的整数集合所无法提供的编译时类型安全。清单1将创建一个枚举类型,并将类型安全的枚举值作为帮助器方法(helpermethod)的参数。该枚举类型的values()方法返回这种类型的不同值的有序数组。
清单1.枚举类型的例子
publicclassLoop{
enumSize{
Small,
Medium,
Large
}
publicstaticvoidmain(Stringargs[]){
for(Sizes:Size.values()){
helper(s);
}
}
privatestaticvoidhelper(Sizes){
System.out.println("Sizevalue:" s);
}
}
构造函数、方法和变量
在使用enum关键字创建新的枚举类型时,实际上是在创建Java.lang.Enum类的子类,其中,枚举类型符合通用模式ClassEnum<EextendsEnum<E>>,而E表示枚举类型的名称。枚举类型的每一个值都将映射到protectedEnum(Stringname,intordinal)构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了每个设置的优先值。换句话说,enumSize{Small,Medium,Large}将映射到清单2中所示的构造函数调用中:
清单2.映射的构造函数调用
newEnum<Size>("Small",0);
newEnum<Size>("Medium",1);
newEnum<Size>("Large",2);
不必将构造函数的使用限制为间接Enum构造函数调用。在使用enum关键字时,将创建Enum的子类。您可以使用参数和任何别的东西为定义的每个名称添加一些您自己的构造函数调用。名称声明可以看作是对构造函数的调用,您不必添加new关键字。这种方法允许您将数据作为参数值传递给构造函数调用,如清单3所示。该参数表示Size对象的枚举集合的定价因子。位于枚举类型定义之后的main()方法演示了这种用法。
清单3.定制构造函数的例子
publicclassSample{
enumSize{
Small(0.8),
Medium(1.0),
Large(1.2);
doublepricingFactor;
Size(doublep){
pricingFactor=p;
}
}
publicstaticvoidmain(Stringargs[]){
Sizes=Size.Large;
doubled=s.pricingFactor;
System.out.println(s "Sizehaspricingfactorof" d);
}
}
运行该程序将返回给定Size的定价因子。您还可以定义一个类似于getPricingFactor()的方法,并将pricingFactor字段设置为private,以便更多地将它作为类JavaBean的属性对待。清单4给前面的例子添加了一个方法:
清单4.方法的例子
publicclassSample2{
enumSize{
Small(0.8),
Medium(1.0),
Large(1.2);
privatedoublepricingFactor;
Size(doublep){
pricingFactor=p;
}
publicdoublegetPricingFactor(){
returnpricingFactor;
}
}
publicstaticvoidmain(Stringargs[]){
Sizes=Size.Large;
doubled=s.getPricingFactor();
System.out.println(s "Sizehaspricingfactorof" d);
}
}
对于这两种情况,输出均为:
LargeSizehaspricingfactorof1.2
预定义的方法
因为用户定义的枚举类型是Enum类型的子类,所以您需要继承用于您的类型的那个类的所有方法。下面列出了完整的方法集合(E表示枚举类型自身):
publicintcompareTo(Ee)
publicbooleanequals(Objecto)
publicfinalClass<E>getDeclaringClass()
publicinthashCode()
publicStringname()