我目前正在尝试在我们的服务器上重新编写一些代码,这些代码是超级非漂亮的 Java 硬编码混乱。服务器从用户那里接收一个字节操作码,然后是一些可变的大小。然后,服务器将通过读取操作码中存储在大数组中的任何数据包类型来处理此信息。下面是这个样子:
class Type {
private static Type[] ids = new Type[256];
static {
type[0] = new SomeType();
type[1] = new Another();
type[2] = new SomeType4();
// 254 more entries . . .
}
}
我正在尝试寻找一种更自动化的方法。我的第一个想法是创建一个PacketType
包含public static final List<PacketType> packets
. 然后,在static
初始化器中的每个实现类中,它将自身的实例添加到列表中。然而,该解决方案存在两个问题:
- 需要将相同的类初始化代码“复制粘贴”到每个实现类中。
- 这些类将以不可预知的顺序添加到列表中。客户端将不知道哪个数据包用作哪个字节码。
我考虑的另一个解决方案是拥有一个PacketKeeper
具有 aMap<Byte, Class<? extends PacketType>>
和 parallel的类Map<Class<? extends PacketType>, Byte>
。对于我在 Java 语义中遇到的这个问题,肯定有更好、更漂亮的解决方案。重构这个长链初始化器的最佳方法是什么?