首页 > 其他 > 详细

枚举的封装

时间:2020-03-29 00:56:32      阅读:66      评论:0      收藏:0      [点我收藏+]

枚举是什么?

  枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。

声明枚举

声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等枚举声明的语法如下:

enum-modifiers enum enumname:enum-base{
    enum-body,
}
  • enum-modifiers 表示枚举的修饰符主要包括 public、private 和 internal;
  • enumname 表示声明的枚举名称;
  • enum-base 表示基础类型;
  • enum-body 表示枚举的成员,它是枚举类型的命名常数。

任意两个枚举成员不能具有相同的名称,且它的常数值必须在该枚举的基础类型的范围之内,多个枚举成员之间使用逗号分隔。

提示:如果没有显式地声明基础类型的枚举,那么意味着它所对应的基础类型是 int。

使用1:下面代码定义了一个表示性别的枚举类型 SexEnum 和一个表示颜色的枚举类型 Color。

//性别的枚举类型
enum SexEnum{
    male,female;
}
//表示颜色的枚举类型
enum Color{
    RED,BLUE,GREEN,BLACK,YELLOW;
}

public class EnumDemo {
    Color color=Color.RED;

    public void change(){
        switch(color){
            case RED:
                color=Color.GREEN;
                break;
            case YELLOW:
                color=Color.RED;
                break;
            case GREEN:
                color=Color.YELLOW;
                break;
        }
    }
    public static void main(String[] args) {
        //所有枚举实例都可以调用 Enum 类的方法
        System.out.println(SexEnum.male);//输出结果:male
        System.out.println(SexEnum.female);//输出结果:female

        EnumDemo enumDemo = new EnumDemo();
        enumDemo.change();
        System.out.println(enumDemo.color);//输出结果:GREEN
    }
}

枚举类

  Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。所有枚举实例都可以调用 Enum 类的方法,常用方法如表 1 所示。

表1 Enum类的常用方法

方法名称描述
values() 以数组形式返回枚举类型的所有成员
valueOf() 将普通字符串转换为枚举实例
compareTo() 比较两个枚举成员在定义时的顺序
ordinal() 获取枚举成员的索引位置

 valueOf()的用法:类型转换

enum SeasonEnum {
    SPRING, SUMMER, FALL, WINTER;
}
public class EnumDemo2 {
    public static void main(String[] args) {
        SeasonEnum a;//定义枚举类型变量a,用于接收valueOf()方法的返回值
        a=SeasonEnum.valueOf("SPRING");//valueOf()方法调用者为枚举类,此处为SeasonEnum;
        System.out.println(a.name());//SPRING
        // 形参只需一个——枚举值名称,注意是String类型,要加双引号,此处为"SPRING"
        System.out.println(a.compareTo(SeasonEnum.SPRING));//通过a调用实例方法compareTo(),输出0,表明a为枚举值SPRING
    }
}

个人理解:SeasonEnum.valueOf("SPRING")  将字符串SPRING,传给枚举类,生产一个枚举实例。

 

使用2:通过调用枚举类型实例的 values() 方法可以将枚举的所有成员以数组形式返回,也可以通过该方法获取枚举类型的成员。

//定义一个枚举类型
enum Signal{
    GREEN,YELLOW,RED;
}
public static void main(String[] args){
    for(int i=0;i<Signal.values().length;i++)    {
        System.out.println("枚举成员:"+Signal.values()[i]);
    }
}

输出结果:

枚举成员:GREEN 
枚举成员:YELLOW 
枚举成员:RED

 

使用3:创建一个示例,调用 valueOf() 方法获取枚举的一个成员,再调用 compareTo() 方法进行比较,并输出结果。

public enum Sex {
   //定义一个枚举
   male,female;
}
public class TestEnum {
    public static void main(String[] args) {
        compare(Sex.valueOf("male"));    //比较
    }

    public static void compare(Sex s) {
        for(int i=0;i<Sex.values().length;i++){
            System.out.println(s+"与"+Sex.values()[i]+"的比较结果是:"+s.compareTo(Sex.values()[i]));
        }
    }
}

输出结果:

male与male的比较结果是:0
male与female的比较结果是:-1

 

使用4:通过调用枚举类型实例的 ordinal() 方法可以获取一个成员在枚举中的索引位置。下面的示例创建一个包含 3 个成员的枚举类型 Signal,然后调用 ordinal() 方法输出成员及对应索引位置。

public class TestEnum1{
    enum Signal{
        //定义一个枚举类型
        GREEN,YELLOW,RED;
    }

    public static void main(String[] args)    {
        for(int i=0;i<Signal.values().length;i++){
            System.out.println("索引"+Signal.values()[i].ordinal()+",值:"+Signal.values()[i]);
        }
    }
}

输出结果:

索引0,值:GREEN
索引1,值:YELLOW
索引2,值:RED

 

使用5:下面的代码创建了一个枚举类型 WeekDay,而且在该类型中添加了自定义的方法。

注:为枚举添加方法;Java 为枚举类型提供了一些内置的方法,同时枚举常量也可以有自己的方法。此时要注意必须在枚举实例的最后一个成员后添加分号,而且必须先定义枚举实例。

enum WeekDay{    
   Mon("Monday"),
   Tue("Tuesday"),
   Wed("Wednesday"),
   Thu("Thursday"),
   Fri("Friday"),
   Sat("Saturday"),
   Sun("Sunday");
//以上是枚举的成员,必须先定义,而且使用分号结束 private final String day; private WeekDay(String day){ this.day=day; } public static void printDay(int i) { switch(i) { case 1: System.out.println(WeekDay.Mon); break; case 2: System.out.println(WeekDay.Tue); break; case 3: System.out.println(WeekDay.Wed); break; case 4: System.out.println(WeekDay.Thu); break; case 5: System.out.println(WeekDay.Fri); break; case 6: System.out.println(WeekDay.Sat); break; case 7: System.out.println(WeekDay.Sun); break; default: System.out.println("wrong number!"); } } public String getDay() { return day; } }

测试:

public static void main(String[] args){
    for(WeekDay day:WeekDay.values()){
        System.out.println(day+"====>"+day.getDay());
    }
    WeekDay.printDay(5);
}

输出结果如下:

Mon====>Monday
Tue====>Tuesday
Wed====>Wednesday
Thu====>Thursday
Fri====>Friday
Sat====>Saturday
Sun====>Sunday
Fri

 

使用6:Java 中的 enum 还可以跟 Class 类一样覆盖基类的方法。下面示例代码创建的 Color 枚举类型覆盖了 toString() 方法。

public class Test{
    public enum Color {
        RED("红色",1),
     GREEN("绿色",2),
     WHITE("白色",3),
     YELLOW("黄色",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; } } public static void main(String[] args) { System.out.println(Color.RED.toString()); //输出:1-红色 } }

EnumMap 和 EnumSet

  为了更好地支持枚举类型,java.util 中添加了两个新类:EnumMap 和 EnumSet。使用它们可以更高效地操作枚举类型。
EnumMap 类是专门为枚举类型量身定做的 Map 实现。虽然使用其他的 Map(如 HashMap)实现也能完成枚举类型实例到值的映射,但是使用 EnumMap 会更加高效。java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。

使用7:下面是使用 EnumMap 的一个代码示例。枚举类型 DataBaseType 里存放了现在支持的所有数据库类型。针对不同的数据库,一些数据库相关的方法需要返回不一样的值,例如示例中 getURL() 方法。

//定义数据库类型枚举
public enum DataBaseType{
    MYSQUORACLE,
  DB2,
  SQLSERVER; }
//某类中定义的获取数据库URL的方法以及EnumMap的声明 private EnumMap<DataBaseType,String> urls=new EnumMap<DataBaseType,String>(DataBaseType.class); public DataBaseInfo(){ urls.put(DataBaseType.DB2,"jdbc:db2://localhost:5000/sample"); urls.put(DataBaseType.MYSQL,"jdbc:mysql://localhost/mydb"); urls.put(DataBaseType.ORACLE,"jdbc:oracle:thin:@localhost:1521:sample"); urls.put(DataBaseType.SQLSERVER,"jdbc:microsoft:sqlserver://sql:1433;Database=mydb"); }
//根据不同的数据库类型,返回对应的URL //@param type DataBaseType 枚举类新实例 //@return public String getURL(DataBaseType type){ return this.urls.get(type); }

EnumSet 是枚举类型的高性能 Set 实现,它要求放入它的枚举常量必须属于同一枚举类型。

EnumSet 提供了许多工厂方法以便于初始化,如表 所示。

技术分享图片

使用8:实现接口(多实现)

interface Behaviour {
    void print();
    String getInfo();
}
interface Behaviour2 {
}
public enum EnumDemo implements Behaviour,Behaviour2{
    RED("红色", 1), 
    GREEN("绿色", 2), 
    BLANK("白色", 3), 
    YELLO("黄色", 4);
    
    // 成员变量
    private String name;
    private int index;
    // 构造方法
    private EnumDemo(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 static void main(String[] args) {
        EnumDemo.RED.print();
    }
}

使用9:接口组织枚举

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


枚举的封装

原文:https://www.cnblogs.com/gjq1126-web/p/12590252.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!