枚举介绍和常见用法

一、枚举介绍

 

1、枚举

枚举类型在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,java语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。枚举类型的定义和枚举变量的说明枚举的主要目的,我觉得就是使代码的可读性更好。如果没有枚举,其所要实现的功能也可以通过其它方式实现。

枚举类适用在什么地方?

一条普遍规则是,任何使用常量的地方,例如目前用switch代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。

2、枚举类的基本定义

  public enum Color{
  RED,BLUE,BLACK,YELLOW,GREEN
  }
 
  public enum Color{
  RED,BLUE,BLACK,YELLOW,GREEN
     }

例子

枚举在类中这样使用是不是方便了许多,假设你开始要定义好多静态的常量:

enum URL{  
        HOST( "www.google.com" ),  
        CAPTCHA( "/logo.jpg" ),  
        ACTION_0( "/promotion.html?locale=en_GB" ),  
        ACTION_1( "/agreement.html" ),  
        ACTION_2( "/authkey.html" ),  
        ACTION_3( "/contactinfo.html" ),  
        ACTION_4( "/accountname.html" ),  
        ACTION_5( "/verify.html" ),  
        ACTION_6( "/completed.html" );  
        String value;  
        URL( String value ) {  
               this.value = value;  
        }  
    }

很简单就可以取值:URL.ACTION_3.value。

3、常量定义介绍

常常java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义。

Java中的枚举类型采用关键字enum来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum类型。要了解枚举类型,建议大家先打开jdk中的Enum类简单读一下,这个类里面定义了很多protected方法,比如构造函数,如果要使用这些方法我们可以把枚举类型定义到当前类中。每个枚举类型,都有自己的名字和顺序,当我们输出一个枚举类型的时候,会输入枚举类型的name。

二、定义常量的方式

 

1、通常定义常量方法

我们通常利用public final static 方法定义的代码如下,分别用1 表示红灯,3 表示绿灯,2 表示黄灯。

public class Light {
    /* 红灯 */
    public final static int RED =1;
    /* 绿灯 */
    public final static int GREEN =3;
    /* 黄灯 */
    public final static int YELLOW =2;
}

2、枚举类型定义常量方法

枚举类型的简单定义方法如下,我们似乎没办法定义每个枚举类型的值。比如我们定义红灯、绿灯和黄灯的代码

public enum Light {
    RED , GREEN , YELLOW ;
}

三、枚举(enum)详解7种常见的用法

用法一:常量

在JDK1.5之前,我们定义常量都是:public static fianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

public enum Color {  
  RED, GREEN, BLANK, YELLOW  
}  

用法二:switch

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
放byte,short,char类型的也可以。
可以自动提升(自动类型转换)为int。
而不能放long型和String型。
而在JDK1.7的版本中,switch中可以使用字串String。但仍不支持long型。

enum Signal {
    GREEN, YELLOW, RED
}
public class TrafficLight {
    Signal color = Signal.RED;
    public void change() {
        switch (color) {
        case RED:
            color = Signal.GREEN;
            break;
        case YELLOW:
            color = Signal.RED;
            break;
        case GREEN:
            color = Signal.YELLOW;
            break;
        }  
    }  
}

用法三:向枚举中添加新方法

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且Java要求必须先定义enum实例。

public enum Color {  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
    // 普通方法  
    public static String getName(int index) {  
        for (Color c : Color.values()) {  
            if (c.getIndex() == index) {  
                return c.name;  
            }  
        }  
        return null;  
    }  
    // get set 方法  
    public String getName() {  
        return name;  
    }  
    public void setName(String name) {  
        this.name = name;  
    }  
    public int getIndex() {  
        return index;  
    }  
    public void setIndex(int index) {  
        this.index = index;  
    }  
}  

用法四:覆盖枚举的方法

下面给出一个toString()方法覆盖的例子。

public enum Color {  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
    //覆盖方法  
    @Override  
    public String toString() {  
        return this.index+"_"+this.name;  
    }  
}  

用法五:实现接口

所有的枚举都继承自java.lang.Enum类。由于Java不支持多继承,所以枚举对象不能再继承其他类。

public interface Behaviour {  
    void print();  
    String getInfo();  
}  
public enum Color implements Behaviour{  
    RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);  
    // 成员变量  
    private String name;  
    private int index;  
    // 构造方法  
    private Color(String name, int index) {  
        this.name = name;  
        this.index = index;  
    }  
//接口方法  
    @Override  
    public String getInfo() {  
        return this.name;  
    }  
    //接口方法  
    @Override  
    public void print() {  
        System.out.println(this.index+":"+this.name);  
    }  
}  

用法六:使用接口组织枚举

public interface Food {  
    enum Coffee implements Food{  
        BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
    }  
    enum Dessert implements Food{  
        FRUIT, CAKE, GELATO  
    }  
}  

用法七:关于枚举集合的使用

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。

举例

下面的示例演示java.util.EnumSet.allOf()方法的用法。

public class EnumSetDemo {
 
    // create an enum
    public enum Numbers {
        ONE, TWO, THREE, FOUR, FIVE
    };
 
    public static void main(String[] args) {
        // create an empty EnumSet 
        EnumSet<Numbers> set = null;
        // print the set
        System.out.println(set);
        // create the set by getting all elements from Numbers
        set = EnumSet.allOf(Numbers.class);
        // print the updated set
        System.out.println("Updated set:" + set);
    }

运行结果

null
Updated set[ONE,TWO,THREE,FOUR,FIVE]

其他请看http://www.yiibai.com/java/util/java_util_enumset.html点击打开链接

这里边有详细的文档介绍

参考:

http://hujin.iteye.com/blog/479638点击打开链接

http://blog.csdn.net/wgw335363240/article/details/6359614点击打开链接

http://blog.csdn.net/qq_27093465/article/details/52180865点击打开链接

发布了27 篇原创文章 · 获赞 6 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/Liuyuelinjiayou/article/details/52414793