我有一个接收包(字节数组)的套接字类。每个包都有一个整数来标识它的类型。switch 语句中的每个 case 都如下所示:
switch(packet.getHeader().getID()) {
case PingRequest.ID:
if(data.length != PingRequest.SIZE)
return null;
PingRequest pingRequest = new PingRequest(data); /* specific parsing of the byte array */
pingRequest.setHeader(data); /* method of the abstract class */
packet = pingRequest;
break;
case Error.ID:
if(data.length != Error.SIZE)
return null;
Error error = new Error(data);
error.setHeader(data);
packet = error;
break;
...
每个数据包都有不同的信息,这就是为什么每个数据包都有不同的构造函数(从字节数组创建数据包成员data
)
由于每个案例看起来都有些相似(并且有很多),我认为我应该使用 HashMap 来优化它:
public static HashMap<Integer, Class<?>> _packetTypes = new HashMap<Integer, Class<?>>();
_packetTypes.put(PingRequest.ID, PingRequest.class);
我现在想要实现的是这样的:
Class<?> myClass = PacketAbstract._packetTypes.get(packet.getHeader().getID());
Class[] cArg = new Class[1];
cArg[0] = Byte.class;
Constructor<?> ct = myClass.getConstructor(cArg);
/* Doesn't make any sense from here on */
myClass specialPacket = ct.newInstance(data);
specialPacket.setHeader(data);
packet = specialPacket;
所以基本的想法是创建一个包含数据包ID和相应的数据包类的哈希图,这将允许我创建专门的数据包。最后一段代码是为了替换我的 switch 语句。
问题:
我的想法如何解决这个问题正确吗?如果不是请赐教。如何实现到目前为止没有意义的代码的最后一部分(如果这是正确的方法)?
编辑:数据包是抽象类的一个对象,Packet
它被每个特殊的数据包扩展,比如PingRequest