public enum Season { winter, spring, summer, fall }
一个enum是定义一组值的对象,它可以包括零个或多个值成员.它是属于enum类型的,一个enum对象中不可有两个或多个相同的属性或值.在次之前的java程序员一般是 用接口的方法实现列举的,如 :
public interface Season {
static winter = 0;
static spring = 1; //etc..
}
引入了enum的java的列举的编写方便了许多,只须定义一个enum型的对象.enum对象的值都回自动获得一个数字值,从0开始,依次递增.看一个比较简单的enum实现的例子:
EnumDemo.java
package net.javagarage.enums;
/*
We can loop over the values we put into the enum
using the values() method.
Note that the enum Seasons is compiled into a
separate unit, called EnumDemo$Seasons.class
*/
public class EnumDemo {
/*declare the enum and add values to it. note that, like in C#, we don't use a ; to
end this statement and we use commas to separate the values */
private enum Seasons { winter, spring,
summer, fall }
//list the values
public static void main(String[] args) {
for (Seasons s : Seasons.values()){
System.out.println(s);
}
}
}
运行上述代码你回得到 以下结果:
winter
spring
summer
fall
Enum的属性调用:
下面的代码展示了调用enum对象的方法,这也是它通常的用法:
package net.javagarage.enums;
/*
File: EnumSwitch.java
Purpose: show how to switch against the values in an enum.
*/
public class EnumSwitch {
private enum Color { red, blue, green }
//list the values
public static void main(String[] args) {
//refer to the qualified value
doIt(Color.red);
}
/*note that you switch against the UNQUALIFIED name. that is, "case Color.red:" is a
compiler error */
private static void doIt(Color c){
switch (c) {
case red:
System.out.println("value is " + Color.red);
break;
case green:
System.out.println("value is " + Color.green);
break;
case blue:
System.out.println("value is : " + Color.blue);
break;
default :
System.out.println("default");
}
}
}
return winter;
else
return summer;
}
public static void main(String[] args) {
System.out.println(Season.getBest());
}
}
就是这么的简单.但是有一点是需要注意的,那就是enums的值列表必须紧跟在enum声明,不然编译时将会出错.
Enums构造函数:
和类一样enums也可以有自己的构造函数,如下:
package net.javagarage.enums;
public class EnumConstructor {
public static void main(String[] a) {
//call our enum using the values method
for (Temp t : Temp.values())
System.out.println(t + " is : " + t.getValue());
}
//make the enum
public enum Temp {
absoluteZero(-459), freezing(32),
boiling(212), paperBurns(451);
//constructor here
Temp(int value) {
this.value = value;
}
//regular field?but make it final,
//since that is the point, to make constants
private final int value;
//regular get method
public int getValue() {
return value;
}
}
}
输出结果是:
absoluteZero is : -459
freezing is : 32
boiling is : 212
paperBurns is : 451
尽管enums有这么多的属性,但并不是用的越多越好,如果那样还不如直接用类来的直接.enums的优势在定义int最终变量仅当这些值有一定特殊含义时.但是如果你需要的是一个类,就定义一个类,而不是enum.
package testenum;
/**
* @author fubin www.cujava.com
* Enum是enumeration(列举)的简写形式,这个方法用在java中将很很体现出列举在编程中的作用
* 列举可以看成一个量有有限的状态,并把这些状态表先出来,就是列举。
* 本例中ProgramFlags是对类及方法的列举
* Seasons是对变量的定义的列举
*/
public class EnumBitmapExample {
public static void main(String args[])
{
ProgramFlags flag = ProgramFlags.showErrors;
System.out.println("名称:"+flag+
"选种的标识: " +flag.ordinal() +
"标识名称" +flag.name()+
"取值:"+flag.getBitNumber());
System.out.println(Seasons.spring);
}
}
package testenum;
enum ProgramFlags {
showErrors(211),
includeFileOutput(0x02),
useAlternateProcessor(0x04);
private int bit;
ProgramFlags(int bitNumber)
{
bit = bitNumber;
}
public int getBitNumber()
{
return(bit);
}
}
package testenum;
enum Seasons {
winter,
spring,
summer,
fall
}
枚举类型是JDK5中新加的功能.最近两天学习了一下,做一下笔记.
Enum在JDK5中和Class是一个层次的,一种数据类型.可以这么定义:
public enum Grade {
A, B, C, D, F, INCOMPLETE
};
访问的时候像Grade.A这样访问就可以了.这样可能会优点迷惑人.A就好像是Enum的一个构造函数,Grade.A就返回了一个Enum对象.不是访问它的属性或者方法.
下面讲一下emun的使用方法.
1.遍历enum:
for (Grade g : Grade.values()) {
out.println("Allowed value: '" + g + "'");
}
输出如下:
Allowed Value: 'A'
Allowed Value: 'B'
Allowed Value: 'C'
Allowed Value: 'D'
Allowed Value: 'F'
Allowed Value: 'INCOMPLETE'
自己不太明白这么做的目的是什么?到底什么地方会用到.一般不会对它进行遍历吧.觉得意义不是特别大
2.switch 语句中使用.
switch的限制比较大,只能用基本类型,不能用对象.JDK5中进行了扩充,可以使用enum对象,下面是一个例子:
StringBuffer outputText = new StringBuffer(student1.getFullName());
switch (student1.getGrade()) {
case A:
outputText.append(" excelled with a grade of A");
break;
case B: // fall through to C
case C:
outputText.append(" passed with a grade of ")
.append(student1.getGrade().toString());
break;
case D: // fall through to F
case F:
outputText.append(" failed with a grade of ")
.append(student1.getGrade().toString());
break;
case INCOMPLETE:
outputText.append(" did not complete the class.");
break;
}
System.out.println(outputText.toString());
说明一下,最好加上default项,这样对enum进行扩充了,也可以输出.
3.使用EnumMap,EnumSet.
这样可以不使用字符串作为标识了.下面是示例代码:
// Create a map with the key and a String message
EnumMap<AntStatus, String> antMessages =
new EnumMap<AntStatus, String>(AntStatus.class);
// Initialize the map
antMessages.put(AntStatus.INITIALIZING, "Initializing Ant...");
antMessages.put(AntStatus.COMPILING, "Compiling Java classes...");
antMessages.put(AntStatus.COPYING, "Copying files...");
antMessages.put(AntStatus.JARRING, "JARring up files...");
antMessages.put(AntStatus.ZIPPING, "ZIPping up files...");
antMessages.put(AntStatus.DONE, "Build complete.");
antMessages.put(AntStatus.ERROR, "Error occurred.");
// Iterate and print messages
for (AntStatus status : AntStatus.values() ) {
System.out.println("For status " + status + ", message is: " +
antMessages.get(status));
}
枚举集合的作用类似于特性的集合,或者类似于某个枚举类型的所有元素的值的子集。EnumSet
类 拥有以下一系列的静态方法,可以用这些方法从枚举类型中获取单个元素:
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)
public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s)
public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c)
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType)
public static <E extends Enum<E>> EnumSet<E> of(E e)
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4)
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)
public static <E extends Enum<E>> EnumSet<E> range(E from, E to)
一旦创建了 EnumSet
,就可以像对待其他任何 Set
对象那样对待这组对象。
4.enum原理:
enum其实都是创建 java.lang.Enum
类的子类,其中,枚举类型符合通用模式 Class Enum<E> extends Enum<E>>
,而 E
表示枚举类型的名称。protected Enum(String name, int ordinal) ,为构造函数,name为定义的名字,映射为字符串,ordinal为序数.
比如说上面的Grade 将会映射到下面的构造函数:
new Enum<Grade>("A",0)
new Enum<Grade>("B",0)
new Enum<Grade>("C",0)
new Enum<Grade>("D",0)
new Enum<Grade>("F",0)
new Enum<Grade>("INCOMPLETE",0)
5.预定义构造函数.
构造函数不仅可以是默认的,还可以自己定制,下面是一个实例:
enum Grade{
A(90),
B(80),
C(70),
D(60),
F(50);
public int grade;
Grade(int grade){
this.grade=grade;
}
}这样每一个成绩都会对应一个分数.Grade(int grade)是改写后的构造函数.注意各个构造函数间应该为逗号,非分号.
6.特定于常量的主体
很难理解的一个术语.其实意思大概是可以为每一个枚举的值进行继承,继承自当前这个eunm,把这个方法进行覆写.可以看下面一个例子.应该很好明白.
enum Grade {
A(90){
public int getGrade(){
return 90;
}
}, B(80), C(70), D(60), F(50);
public int grade;
Grade(int grade) {
this.grade = grade;
}
public int getGrade(){
return 1;
}
}