首页 > 解决方案 > 在 Java 中干净地包装一个数据包对象并传递给具有不同参数的方法

问题描述

在我正在处理的一个项目中,我得到了一个表示多种数据包类型之一的对象。我需要对这个数据包做的是包装它,这样我就可以访问它的字段,然后根据它的类型将它传递给某个验证器列表。

我目前将它设置为HashMap<String,ArrayList<Check>>,其中 String 是数据包类型的名称,每个 ArrayLists 都填充了对单个数据包类型的检查。问题是当我需要一种不同的方法来将每种不同的数据包类型传递给它的检查时,因为最终会接近几十个。

有什么方法可以获取一个包装好的数据包(我没有遇到任何困难),并将它传递给一个检查列表,这些检查都将运行该特定类型的数据包,每个都没有不同的方法?我知道反射是可能的,但我不确定当每个客户端每秒大约 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 结束。

标签: javastructure

解决方案


推荐阅读