根据类ID创建实例

时间:2015-04-02 20:35:48

标签: java oop enums

我目前正在开发一个应用程序,它使用每个分配了自己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模式,但我不确定如何实现这样或类似的东西。

1 个答案:

答案 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子类没有默认构造函数,那么这将失败。一旦你到达那里,你可能想要一个依赖注入容器来处理你的连线。