gpt4 book ai didi

java - 根据类ID创建实例

转载 作者:太空宇宙 更新时间:2023-11-04 13:59:47 25 4
gpt4 key购买 nike

我目前正在开发一个应用程序,该应用程序使用每个数据包分配自己的 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;
}

这工作得相当好,但我仍然很好奇是否有更好的方法来做到这一点?我的想法之一是使用工厂设计模式,但我不确定如何实现这样的东西,或者是否需要它。

最佳答案

这几乎就是要走的路 - 将已知标识符(例如枚举)映射到类类型,然后构造该类。这就是工厂设计模式。最简单的工厂只是切换 id 并返回新的:

 static BasePacket get(int id)
{
switch (id) {
case 0:
return new HandshakePacket();
case 1:
return new HeartbeatPacket();
}
}

当然,这需要您在创建新的 BasePacket 时添加到 switch 语句中。如果您不想这样做,那么您可以(如您的示例中所示)将映射移动到其他位置(可能在运行时加载)并动态构造对象:

static BasePacket get(int id)
{
Packets packetId = Packets.values()[id];
Class packetClass = packetId.getPacketClass();
object packetInstance = packetClass.newInstance();
return (BasePacket)packetInstance;
}

当然,如果您的任何 Packet 子类没有默认构造函数,则此操作将会失败。一旦到达那里,您可能需要一个依赖项注入(inject)容器来为您进行连接。

关于java - 根据类ID创建实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29422000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com