Java 枚举(enum) 六种常用的方法详解

JDK1.5引入了新的类型--枚举,在java中虽然枚举只是一个很小的功能,却给我们带来了很大的方便。
首先我们要了解几个概念,enum是没有构造函数的,准确的来说是没有public类型的构造函数,
它的构造函数只能是private类型的;enum是单例模式;enum中有一个values方法来获取枚举实例对象数组;

说明: MSG_TYPE_SYSTEM是枚举常量,MsgTypeEnum是枚举类,具体实例看下文。
通过枚举常量名称获取对应的枚举实例对象:

MsgTypeEnum s = MsgTypeEnum.valueOf(MSG_TYPE_SYSTEM.name());

获取枚举常量在枚举类中的位序:

MSG_TYPE_SYSTEM.ordinal();
1.用法一:常量

在JDK1.5之前我们定义常量都是:

public static final int a = 4;
上面的这种模式被称为int枚举模式,这种模式是很脆弱的,因为int枚举模式是编译时常量,如果跟常量相关联的值发生变化,那么必须要重新编译才能起作用。

现在好了,可以将相关的常量分组到枚举类型中,而且枚举提供了比常量更多的方法。

public enum Color {  
  RED, GREEN, BLANK, YELLOW  
}
2.向枚举中添加新的方法

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号(“;”),java中要求必须先定义java实例。

package ggmsg.common;

public enum ChannelEnum {

    MSG_CENTER_CHANNEL1("msg_center_channel1"),
    MSG_CENTER_CHANNEL("msg_center_channel");

    private String channel = null;

    private ChannelEnum(String channel) {
        this.channel = channel;
    }

    public String getChannel() {
        return this.channel;
    }
}
3.实现接口

所有的枚举都继承自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);  
    }  
}
4.使用接口组织枚举
package common.lang;

public interface Food {
    enum Coffee implements Food{  
        BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO  
    }  
    enum Dessert implements Food{  
        FRUIT, CAKE, GELATO  
    }  
}
5.switch中使用枚举

在JDK1.6之前switch只支持int、char,之后支持enum类型,能让我们的代码可读性更强。
首先定义一个枚举MsgTypeEnum类,在类中新增fromMsgType方法通过枚举值获取枚举值对应的枚举实例对象。

package ggmsg.common;

public enum MsgTypeEnum {
    //消息类型
    MSG_TYPE_SYSTEM(10001),
    //消息类型
    MSG_TYPE_LIVE_SYSTEM(10002),

    private int msgType;

    private MsgTypeEnum(int msgType){
        this.msgType = msgType;
    }

    public int getMsgType() {
        return this.msgType;
    }
    /**
     * 
     * 方法描述 根据类型的名称,返回类型的枚举实例。 
     *
     */
    public static MsgTypeEnum fromMsgType(int msgType) {  
        for (MsgTypeEnum type : MsgTypeEnum.values()) {  
            if (type.getMsgType() == msgType) {  
                return type;  
            }  
        }  
        return null;  
    } 
}

在方法中定义switch语句,通过fromMsgType方法获取对应的枚举实例对象,在case后面直接写枚举类型的名称,这样我们就可以在switch语句中使用枚举了。

public static void handleMsg(Msg msg) {
        try {
            GGLogger.info(GGMsgService.class, "\nWebSocket接收到的消息是:\n\n"+msg.toString());
            //消息类型
            MsgTypeEnum msgType = MsgTypeEnum.fromMsgType(msg.getMsg_type());
            switch (msgType) {
                //添加用户订阅信息
            case MSG_TYPE_ORDER:
                GGUserSubBuilder.addSubMsg(msg);
                break;
                //消息类型【系统消息】
            case MSG_TYPE_SYSTEM:

                break;
            default:
                break;
            }

        } catch (Exception e) {
            GGUserSubBuilder.sendMsg(msg.getWebSocket(), "WebSocket接收处理消息异常!"+e);
            GGLogger.error(GGMsgService.class, "WebSocket接收处理消息异常!"+e);
        }

    }

通过上面的例子我们可以看到enum的构造函数是private的,不允许外部类通过new的方法获取enum的实例。

6.通过定义抽象方法的方式定义枚举
public enum ProductEnum {

    //机构版
    TERMINAL{
        public int obtainSource() {
            return 4;
        }
    },
    //智投版
    ZHITOU{
        public int obtainSource() {
            return 28;
        }
    },
    //投顾版
    TOUGU{
        public int obtainSource() {
            return 901;
        }
    };

    public abstract int obtainSource();
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页