我目前正在开发一个应用程序,它使用每个分配了自己ID的数据包。每个数据包类都是BasePacket
的子类。我想要做的是当收到一个新数据包时,我想从缓冲区读取ID,然后创建该特定数据包的类的实例,以读取和存储所有数据供以后使用。我的问题是我不知道如何根据ID创建类的实例。我的第一个想法只是一个Enum
,它保存了数据包的ID并引用了它们的类。
public enum Packets
{
HANDSHAKE(0, HandshakePacket.class),
HEARTBEAT(1, HeartbeatPacket.class),
// etc
}
然后我会使用数据包ID调用get方法。
public static BasePacket get(int id)
{
for (Packets packet : Packets.values()) {
if (packet.getId() == id) {
return (BasePacket) packet;
}
}
return null;
}
这很有效,但我仍然很好奇是否有更好的方法可以做到这一点?我的一个想法是使用Factory design
模式,但我不确定如何实现这样或类似的东西。
答案 0 :(得分:0)
这几乎是要走的路 - 你将一个已知的标识符(例如你的枚举)映射到类类型,然后构造类。那是工厂设计模式。最简单的工厂只需切换id并返回new:
static BasePacket get(int id)
{
switch (id) {
case 0:
return new HandshakePacket();
case 1:
return new HeartbeatPacket();
}
}
当然,这需要您在创建新switch
时添加到BasePacket
语句。如果您不想这样做,那么您可以(如您的示例中)将映射移动到其他位置(可能在运行时加载)并动态构造对象:
static BasePacket get(int id)
{
Packets packetId = Packets.values()[id];
Class packetClass = packetId.getPacketClass();
object packetInstance = packetClass.newInstance();
return (BasePacket)packetInstance;
}
当然,如果您的任何Packet
子类没有默认构造函数,那么这将失败。一旦你到达那里,你可能想要一个依赖注入容器来处理你的连线。