比你想象中还要强大的枚举类型---案例篇

  前几天写了一篇介绍枚举功能强大的文章。有几个朋友给我指正说,没有案例单纯描述不够直观。确实啊,在这里我就在写一个案例篇,对上次的文章做补充说明。

  此案例是一个游戏服务器的消息识别器的简化。做过游戏开发都知道,客户端和服务器之间的交互需要定义很多的消息类型,而且这个消息类型是需要不断扩展的。消息识别器就是根据客户端发送过来的消息编码封装成消息实体对象,以供业务逻辑层处理。这里就用这个简化后的消息识别器展示一下枚举的一个应用。(此处主要用作枚举的一个应用实例演示,由于代码做了简化处理,设计上难免会有些不当之处,请见谅)

  消息实体类的一个接口:

public interface IMsg {

	public void setMsgCode(int code);

	public void execute();

	public void readData(IoBuffer bufer);

	public void writerData(IoBuffer bufer);
}

  消息实体类的一个抽象类:

public abstract class AbstractMsg implements IMsg{

	protected int msgCode;

	public AbstractMsg(int msgCode){
		this.msgCode = msgCode;
	}
}

  消息实体的一个实现类:

public class TestMsg extends AbstractMsg{

	public TestMsg(int msgCode) {
		super(msgCode);
	}

	private int data1;
	private int data2;

	@Override
	public void setMsgCode(int code) {
		this.msgCode = code;
	}

	@Override
	public void execute() {
		//消息处理方法
	}

	@Override
	public void readData(IoBuffer bufer) {
		this.data1 = bufer.getInt();
		this.data2 = bufer.getInt();
	}

	@Override
	public void writerData(IoBuffer bufer) {

	}

}

  为了模块化管理,对枚举类型抽出了一个接口,以后一个模块的消息可以注册到一个枚举类上,而这些枚举类都实现此接口

public interface IMsgCodeClass {
	public int getMsgCode();
	public Class<? extends AbstractMsg> getMsgClass();
}

  这是枚举类,可以一个模块一个枚举类,该模块下的消息都注册到该枚举类下

public enum MsgCodeClassConstants implements IMsgCodeClass{
	test(1001,TestMsg.class)//在此就不多罗列一些了
	;

	private int msgCode;
	private Class<? extends AbstractMsg> msgClass;

	MsgCodeClassConstants(int msgCode,Class<? extends AbstractMsg> msgClass){
		this.msgCode = msgCode;
		this.msgClass = msgClass;
	}

	@Override
	public int getMsgCode() {
		return msgCode;
	}

	@Override
	public Class<? extends AbstractMsg> getMsgClass() {
		return msgClass;
	}

}

  最后是消息识别器类:

public class MsgRecogniser {

	Map<Integer, Class<? extends AbstractMsg>> msges = new ConcurrentHashMap<Integer, Class<? extends AbstractMsg>>();

	public void init(){
		MsgCodeClassConstants[] contants = MsgCodeClassConstants.values();
		for(int i=0;i<contants.length;i++){
			msges.put(contants[i].getMsgCode(), contants[i].getMsgClass());
		}
	}

	public IMsg getMsg(int msgCode){
		IMsg msg = null;
		Class clazz = msges.get(msgCode);
		try {
			Constructor constructor = clazz.getConstructor(int.class);
			msg= (IMsg) constructor.newInstance(msgCode);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return msg;
	}

}

  消息识别器往往用在解码器里,解码器接收到数据后首先读取消息编码,然后根据编码调用识别器获取消息实体对象,调用消息实体对象的readData方法把客户端数据独到消息实体对象中。

  以后要扩展消息时,只需要编写消息实体类,然后注册到枚举类中就可以了。:)

比你想象中还要强大的枚举类型---案例篇,布布扣,bubuko.com

时间: 2024-10-22 11:31:01

比你想象中还要强大的枚举类型---案例篇的相关文章

比你想象中还要强大的枚举类型

开发中枚举类型往往被用在可以一一列举的实例中,比如 enum Color{red,green,blue;}.但是可能你不会注意到它的更强大之处,比如如下问题看看你能作答吗 1.枚举类型可以有构造函数吗? 2.枚举类型可以实现接口.继承类吗? 3.枚举类型可以有static成员变量和方法吗?以及可否有实例变量和方法吗? 4.枚举类型可以被继承吗? ..........等(打开eclipse一试便知的知识) 其实enum类型就是一个特殊的java类,它几乎具有一个java类所具有的大部分功能.它更类

springmvc 中model中放入枚举类型

我们直接看例子: Map<String, String> mallMap = new HashMap<String, String>(); mallMap.put(MallStatus.SELFMALL.toString(), MallStatus.SELFMALL.getValue()); mallMap.put(MallStatus.DELEGATIONMALL.toString(), MallStatus.DELEGATIONMALL.getValue()); mallMap

Java数据类型在实际开发中的应用二枚举类型

在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的.在JDK1.5之前,人们用接口来描述这一种数据类型. 1.5以后引入枚举 一:枚举类基本语法 定义: 创建枚举类型要使用 enum 关键字,如果是想声明简单枚举,属性之间用逗号相隔,如果是属性带id,类似(male(1))这种还需要一个带id的构造方法. 简单枚举类: public enum ColorEnum { red, green, yellow, blue;

开发中巧用Enum枚举类型

在实际开发中,在数据库表设计中,我们往往习惯于用一个Int类型的State字段去表示数据的状态,这个字段很方便去表示这条数据的状态,但是又不愿意去建一张这个State字段的外键表去解释状态.(这一类型表状态的字段可能还会有很多,这里只是举个例)   我们一般会把这个State字段当成一个约定,去在项目中应用(比如:0:启用,1:禁用) 在后台管理或其它地方显示Int类型对应的实际状态时,再到公共类中去写一个方法,里面用一个switch...case去返回对应的中文解释. http://www.d

.NET 中关于 TypeCode 和枚举类型的问题

因为C#中没有提供 Switch on Type 的功能,因此要判断类型通常会用一长串的if else,当然这种写法的问题是不够高效,且不够美观.因此 C# 中对常见类型提供了一组枚举值,也就是 TypeCode(这个枚举类型在.NET for Windows App Store 中居然被取消了,大概是因为DBNull这个类型本身也被取消了,这个值没有对应的类型了,干脆连TypeCode就一起取消了).可以使用 Type.GetTypeCode 方法来得到类型对应的枚举值,之后对得到的枚举值进行

科目一比想象中还要简单

考试很简单,过程却很费力. 驾校在管理上多多少少还是有点问题,把200多号人马扔在考场那里,也不说明一下考试流程,弄得很多人云里雾里(包括我). 8点半坐大巴上路,接近2小时才到考场:到了考场就等驾校人员点名,点到名的就可以步行云考室楼考试:但这点名环节明显有猫腻,有教练带去的,或者驾校里面的熟人的,肯定先考!无奈,教练没有来,只能靠上天眷顾,差不多12点的时候,终于被点到名,然后拿着准考证到考室楼,然后接着排队!!!!!! 大概12点40分终于排上号,轮到我考了,妈的. 阿sir叫我坐7号位,

Android中是否推荐使用枚举Enum

一.Enum的产生 Java1.5中引入了枚举的语法,包括Enum,EnumSet,EnumMap等.其中Enum就是我们在C或C++中见过的枚举类型,但是Java中的枚举又比C或C++中的枚举更成熟和复杂.在Java中,枚举算是一种特殊的类,也就是class,因此它可以做很多类相关的事情,而不仅仅是定义几个枚举值 二.Android官方建议 Android官网不建议使用enums,占用内存多(Enums often require more than twice as much memory

第15章 枚举类型和位标志 15.1-15.3

Enumeration提供了一些非常炫酷的功能,相信大多数开发人员都不熟悉.而这些新功能极大的简化了应用程序的开发. 15.1枚举类型 枚举类型(enumerated types)定义了一组“符号名称/值”配对. 以下Color类型定义了一组符号,每个符号都标识一种颜色: internal enum Color { White,//赋值0 Red, //赋值1 Greed,//赋值2 Blue, //赋值3 Orange//赋值4 } 当然,我们也可以写个程序用0代表白色,1代表红色,以此类推.

【转】掌握java枚举类型(enum type)

原文网址:http://iaiai.iteye.com/blog/1843553 1   背景 在java语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组具有int常量.之前我们通常利用public final static 方法定义的代码如下,分别用1 表示春天,2表示夏天,3表示秋天,4表示冬天. Java代码   public class Season { public static final int SPRING = 1; public static final int