在我正在工作的项目中,我得到了一个表示多种数据包类型之一的对象。我需要对这个包做的是 Package 它,这样我就可以访问它的字段,然后根据它的类型将它传递给一个特定的验证器列表。
我现在把它设置为 HashMap<String,ArrayList<Check>>
,其中字符串是数据包类型的名称,每个ArrayList中都填充了对单个数据包类型的检查。问题是当我需要一个不同的方法来将每一个不同的包类型传递给它的检查时,因为最终会有几十个。
有没有什么方法可以将一个 Package 好的数据包(这一点我不难理解)传递给一个检查列表,所有检查都将运行特定类型的数据包,而每个都没有不同的方法?我知道使用反射是可能的,但我不确定当每个客户机每秒大约有20个数据包,有时甚至超过500个客户机时,开销会如何影响性能。
public void run(Object packet) {
switch (packet.getClass().getSimpleName()) {
case "Foo":
check(new WrappedFoo(packet)); break;
case "Bar":
check(new WrappedBar(packet)); break;
case "Baz":
check(new WrappedBaz(packet)); break;
default:
break;
}
private void check(WrappedFoo packet) {
checks.get("Foo").forEach(check -> { check.run(packet); });
}
private void check(WrappedBar packet) {
checks.get("Bar").forEach(check -> { check.run(packet); });
}
private void check(WrappedBaz packet) {
checks.get("Baz").forEach(check -> { check.run(packet); });
}
//and then repeating this several times more...
}
简单地说,有没有任何方法可以在性能或大小上改进上面的代码?在每个check::run方法的开头都不需要任何东西或牺牲太多性能?我试过几种方法,但都以一种或另一种无效的java结束。
暂无答案!
目前还没有任何答案,快来回答吧!