Java 1.5新特性Enum的用法

Enum是enumeration(列举)的简写形式,包含在java.lang包中.熟悉C, C++, C#, 或 Pascal人应该对列举有所了解,先看个例子:

    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");
    }
    }
    }

     为enums添加属性和方法
    enums也可以象一般的类一样添加方法和属性,你可以为它添加静态和非静态的属性或方法,这一切都象你在一般的类中做的那样.
    package net.javagarage.enums;
    /*
    File: EnumDemo.java
    Purpose: show how to use an enum that also defines its own fields and methods
    */
    public class EnumWithMethods {
    //declare the enum and add values to it.
    public enum Season {
    winter, spring, summer, fall;
    private final static String location = "Phoenix";
    public static Season getBest(){
    if (location.equals("Phoenix"))

    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;
 }
}

你可能感兴趣的:(java,spring,C++,c,C#)