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

您所在的位置:网站首页 枚举类values方法 Java 枚举(enum) 六种常用的方法详解

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

2024-06-11 20:55| 来源: 网络整理| 查看: 265

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(); }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3