java枚举的使用

来源:互联网 发布:苹果5s数据开关快捷键 编辑:程序博客网 时间:2024/05/16 09:17


枚举是限定可能值的一种手段,使用枚举可以降低程序出错的几率,并可以提高代码的可读性与可维护性,java枚举并不是简单常量的集合,而是一个对象,其本质依然是类,所以java枚举除了提供了一系列相关值外,还提供了一些额外的功能,甚至还可以根据需求自行添加一些功能,

使用enum关键字定义的枚举,实际上就相当于定义一个类,此类继承了Enum类而已。

使用如下:

定义枚举需要使用关键字enum ,例如一个应用需要两种状态 ON OFF。则可以定义如下:

 /* 枚举 

 */

public enum EnumController {

    ON,OFF   //常量

}

使用:

 定义完枚举后,就可以使用枚举名.枚举项的形式在代码中对定义的枚举进行使用。

public class UseEnum {

 

public static void main(String[] args) {

      EnumController econ= EnumController.ON;

      System.out.println(econ);

      System.out.println(econ.name());

      System.out.println(econ.ordinal());// 序号

      //遍历枚举

       EnumController [] s = econ.values();

       for (int i = 0 ; i < s.length ;i++){

        System.out.println(s[i]);

       }

}

}

枚举中的常用方法:

name (): 返回枚举的名称。

ordinal();返回枚举在项在枚举中的序号。

values(); 返回当前枚举中定义的所有枚举项的集合。

getDeclaringClass (); 用于取得当前枚举值所在类的完整名称。

二:为枚举类添加构造方法和成员方法:

枚举是一种特殊的类,所以其也可以拥有自己的构造器,但是枚举的构造器不可以是public的,其原因在于该构造器是提供给枚举对象中的枚举项构造时使用的,并且每声明一个枚举项时使用这个构造器进行构造。

成员方法:

做法如同给枚举添加构造器一样,可以为枚举添加方法。

如下:

enum MyEnmu {

     ON ("",EnumController.ON),

 OFF ("",EnumController.OFF);

 private String Summary;

 private EnumController en;

 private MyEnmu (String Summary,EnumController en ){

 this.Summary = Summary;

 this.en = en;

 }

 public String getSummary (){

 return Summary;

 }

 public EnumController  getState() {

return this.en;

}

 

}

通过以上观察得出:

通过以上机制,可以将枚举本身要表达的含义与其具体的信息很好的整合起来,杜绝了传统语言中含义与信息分离的的弊端。

  测试如下:

public class Use2 {

 

public static void main(String[] args) {

       for (MyEnmu em : MyEnmu.values()){

          System.out.println(em);

          System.out.println(em.getSummary());

          System.out.println(em.getState());

       }

       MyEnmu  em2 = MyEnmu.valueOf("ON");

       System.out.println(em2);

       System.out.println(em2.getSummary());

}

}

 三: 枚举集合:

Java中的枚举是一个对象,枚举对象中的各种枚举项也是对象,在java中集合容器要求存储在其中的每一个成员均是对象,枚举做为一种特殊的类,java与而提供了专门的集合容器 EnumSet EnumMap

 Enumset :

 用于保存枚举项的集合,在枚举项本身不互斥的情况下特别有用,例如:一个应用系统通常会有多中角色,而某些人承担多中角色,如果这些角色都是通过枚举定义,此时Enumset

可以将多中角色保存在一起,标识特定用户承担的全部角色。

其提供了很多可以产生EnumSet的实例方法。

 如下:

/* 枚举 

 */

public enum EnumController {

    ON,OFF   //常量

}

测试:

public class EnumSetDemo {

    public static void main(String[] args) {

     /*

      * 创建一个包含指定元素类型的所有元素的枚举 set

      * EnumSet 的时间 和空间性能应该是很好的。

      */

EnumSet<EnumController > set = EnumSet.allOf(EnumController.class);

for ( EnumController enumController :set ){

System.out.println(enumController);

}

}

}  

 

EnumMap

  必须使用枚举项作为其KEYMap算法与普通的Map类似,枚举映射在内部表示为数组。此表示形式非常紧凑且高效。

  使用如下:

public enum EnumController {

    ON,OFF   //常量

}

测试:

public class EnumMapDemo {

public static void main(String[] args) {

   EnumMap< EnumController, String> map = new EnumMap<EnumController,String >(EnumController.class);; 

    map.put(EnumController.ON, "");

    map.put(EnumController.OFF,"");

    Set <EnumController> set=map.keySet();

    for (EnumController enumController : set) {

 System.out.println(enumController+"---"+map.get(enumController));

}

}

}

让枚举实现接口:

 定义接口:

 public interface Info {

 public String getColor ();

}

2:  在枚举上实现接口 

 

public enum EnumClor implements Info {

RED {

@Override

public String getColor() {

return "红色";

}

},

BLUE {

@Override

public String getColor() {

return "蓝色";

}

},

GREEN {

@Override

public String getColor() {

return "绿色";

}

};:

}

测试:

public class EnumClorTest {

  public static void main(String[] args) {

System.out.println(EnumClor.GREEN.getColor());

}

}

原理分析:

 enum的语法尽管和class文件的语法不一样,但经过编译后产生的二就是一个Class文件,该Class文件经过反编译实际上生成的是一个类,该类继承了java.lang.Enum<E>。因此可以吧enem看成是一个class,可以用来定义一些属性和方法。

 

 

 

 

 

 

 

 

 

 

 

 

 特别注意:

enum 可以实现接口, 但是其不能够继承类,因为其本身就已经就继成了Enum 类。

枚举中如果定义一个对象的情况下,就类似与单例模式。

 

 

 

 

   

0 0
原创粉丝点击