【发布时间】:2015-07-07 20:33:47
【问题描述】:
我正在制作一个多人游戏,它大量使用可序列化的Event 类通过网络发送消息。我希望能够基于常量重构Event 的适当子类。
到目前为止,我选择了以下解决方案:
public class EventFactory {
public static Event getEvent(int eventId, ByteBuffer buf) {
switch (eventId){
case Event.ID_A:
return EventA.deserialise(buf);
case Event.ID_B:
return EventB.deserialise(buf);
case Event.ID_C:
return EventC.deserialise(buf);
default:
// Unknown Event ID
return null;
}
}
}
但是,这让我觉得非常冗长,并且每次创建新的 Event 类型时都会添加一个新的“case”语句。
我知道实现此目的的其他 2 种方法,但似乎都没有更好*:
- 创建常量映射 -> 事件子类,并使用 clazz.newInstance() 实例化它们(使用空的构造函数),然后使用 clazz.initialiase(buf) 提供必要的参数。
- 创建常量映射 -> 事件子类,并使用反射在适当的类中查找和调用正确的方法。
有没有比我现在使用的更好的方法?我是否不明智地忽略上述替代方案?
*注意:在这种情况下,更好意味着更简单/更清洁,但不会过多影响速度。
【问题讨论】:
-
事件有多少种?是否有不使用某些标准有线格式(例如 JSON 或 XML)的特殊原因?
-
为什么不让Event实现Serializable,然后直接读写Event对象呢?
-
目前有大约 20 种事件类型,但我会继续添加更多。目前我正在使用 ByteBuffers 手动序列化/反序列化事件,正如您在此处看到的那样,因为它快速且非常少;我想发送尽可能少的字节。我不能使用 Serializable,因为我是以数据包而不是流的形式发送数据。不过我对 JSON 很好奇 - 与速度和发送的数据量相比如何?
标签: java reflection instantiation