zoukankan      html  css  js  c++  java
  • Java中的枚举

    枚举通过enum关键字进行定义。实际上当定义一个枚举类型的时候,该类型默认继承了Enum类。

     

    枚举的定义格式如下:

    enum Color
    {
        RED,BLUE,GREEN;
    }

    下面演示一个枚举变量的声明和输出:

    1 public static void main(String[] args)  throws Exception
    2 {   
    3     Color c = Color.RED;
    4     System.out.println(c);
    5 }

    当我们要遍历所有的枚举类型时,可以先将其转换为一个数组,然后用foreach语法进行输出。

    1 public static void main(String[] args)  throws Exception
    2 {   
    3     Color[] colors = Color.values();
    4     for(Color color : colors)
    5     {
    6         System.out.println(color);
    7     }
    8 }  

    Enum类的构造函数如下:

    1 Enum(String name, int ordinal)

    因为所有的枚举类型都默认继承Enum,所以上面的代码实际上默认调用了该构造函数。name的值就是RED,BLUEGREEN,而ordinal的值从0开始。所以,下面的代码演示了每个枚举变量的nameordinal值。

    1 public static void main(String[] args)  throws Exception
    2 {   
    3     Color[] colors = Color.values();
    4     for(Color color : colors)
    5     {
    6         System.out.println(color.ordinal() + ":" + color.name());
    7     }
    8 }  

    输出结果为:

    0:RED

    1:BLUE

    2:GREEN

     

    我们在定义枚举类的时候,也可以定义构造函数。因为枚举类的实例必须是有限的个数(本文中Color中只有3种颜色),所以,构造函数必须私有化。

     1 enum Color
     2 {
     3     RED("红色"),BLUE("蓝色"),GREEN("绿色");
     4     
     5     private String alias;
     6     private Color(String alias)
     7     {
     8         this.alias = alias;
     9     }
    10     public String getAlias()
    11     {
    12         return this.alias ;
    13     }18 }

    因为定义了带参数的构造函数,所以在实例化枚举实例的时候,必须传入参数。

    此时用下面的代码测试:

    1 public static void main(String[] args)  throws Exception
    2 {   
    3     Color[] colors = Color.values();
    4     for(Color color : colors)
    5     {
    6         System.out.println(color.ordinal() + ":" + color.name() + "("+color.getAlias()+")");
    7     }
    8 }

    利用上面的特性,我们可以设计一个表示状态的枚举。如我们想定义一个会员状态的枚举类,会员状态有:待激活(0)、已激活(1)、锁定(-1)这三种状态。我们已经知道了,枚举变量有ordinal()方法可以提取该枚举变量的序号,然而这个数值只是代表该枚举序号,从0开始,显然无法表示-1,0,1这三种状态。这里可以借助构造方法来实现我们的需求:

     

     1 enum MemberState
     2 { 
     3     LOCKED(-1),READY(0),ACTIVED(1);
     4     
     5     private Integer code ;
     6     
     7     private MemberState(Integer code)
     8     {
     9         this.code = code;
    10     }
    11     
    12     public Integer getCode()
    13     {
    14         return this.code;
    15     }
    16 }

     

    测试代码:

     

     

     1 public class Main
     2 {
     3     public static void main(String[] args)
     4     {
     5         for(MemberState item : MemberState.values())
     6         { 
     7             System.out.println("序号:"+item.ordinal());
     8             System.out.println("状态:"+item.name());
     9             System.out.println("代码:"+item.getCode());
    10             System.out.println("----------");
    11         }
    12         System.out.println("Main Done//~~");
    13     }
    14 }

     

    输出结果:

    序号:0
    状态:LOCKED
    代码:-1
    ----------
    序号:1
    状态:READY
    代码:0
    ----------
    序号:2
    状态:ACTIVED
    代码:1
    ----------
    Main Done//~~

     

    因为Enum实现了Comparable接口,所以可以对枚举类型排序:

     1 public static void main(String[] args)  throws Exception
     2 {   
     3     Set<Color> colorSet = new TreeSet<Color>();
     4     colorSet.add(Color.BLUE);
     5     colorSet.add(Color.GREEN);
     6     colorSet.add(Color.RED);
     7     for(Color color : colorSet)
     8     {
     9         System.out.println(color.ordinal() + ":" + color.name() + "("+color.getAlias()+")");
    10     }
    11 }  

    输出结果:

    0:RED(红色)

    1:BLUE(蓝色)

    2:GREEN(绿色)

    我们也可以将一个字符串解析为枚举类型:

    1 public static void main(String[] args)  throws Exception
    2 {   
    3     Color cRed = Color.valueOf("RED");
    4     Color cBlue = Color.valueOf("BLUE");
    5     System.out.println(cRed.ordinal() + ":" + cRed.name() + "("+cRed.getAlias()+")");
    6     System.out.println(cBlue.ordinal() + ":" + cBlue.name() + "("+cBlue.getAlias()+")");
    7 }  

    输出结果:

    0:RED(红色)

    1:BLUE(蓝色)

  • 相关阅读:
    【Head First Servlets and JSP】笔记3:Servlet的生命周期
    正则表达
    【Java Web】把逻辑名映射到servlet文件
    【Head First Servlets and JSP】笔记2:MVC迷你教程
    【算法(第4版)】笔记
    【Head First Servlets and JSP】笔记1
    【python】对象和面向对象
    【深度探索c++对象模型】Function语义学之成员函数调用方式
    【c++】多重继承与虚继承
    【Scrapy】Selectors
  • 原文地址:https://www.cnblogs.com/kuillldan/p/6112366.html
Copyright © 2011-2022 走看看