gpt4 book ai didi

java - 在不相关的类中填充公共(public)字段的框架

转载 作者:搜寻专家 更新时间:2023-11-01 02:48:31 25 4
gpt4 key购买 nike

我正在尝试编写一个框架来处理与外部库及其 API 的接口(interface)。作为其中的一部分,我需要填充一个 header 字段,该字段在许多(70 种)可能的消息类中的每一个中都具有相同的名称和类型。不幸的是,不是让每个消息类都派生自包含 header 字段的公共(public)基类,而是每个消息类都是完全独立的。

作为玩具示例:

public class A
{
public Header header;
public Integer aData;
}

public class B
{
public Header header;
public Long bData;
}

如果他们合理地设计了它们,其中 A 和 B 派生自某个包含 header 的基类,我可以这样做:

public boolean sendMessage(BaseType b)
{
b.header = populateHeader();
stuffNecessaryToSendMessage();
}

但就目前而言,Object 是唯一的公共(public)类。我想到的各种选择是:

  • 每种类型都有一个单独的方法。这会奏效,而且速度很快,但代码重复会造成令人沮丧的浪费。
  • 我可以对每个类型进行子类化,并让它们实现一个通用接口(interface)。虽然这可行,但创建 70 多个子类然后修改代码以使用它们而不是原始消息传递类是一个过头的桥梁。
  • 反射(reflection)。可行,但我预计它会太慢(这里的性能是一个问题)

鉴于这些,每个单独的方法似乎是我最好的选择,但我希望有更好的选择。

最佳答案

我建议您执行以下操作。创建一组您想要的接口(interface)。例如

public interface HeaderHolder {
public void setHeader(Header header);
public Header getHeader();
}

我希望你的类来实现它们,也就是说你的类 B 被定义为

B 类实现 HeaderHolder {...}

不幸的是,事实并非如此。现在问题来了!

创建门面:

public class InterfaceWrapper {
public <T> T wrap(Object obj, Class<T> api) {...}
}

您可以在此阶段使用动态代理来实现它。是的,动态代理使用反射,但现在忘记这个。

完成后,您可以按如下方式使用 InterfaceWrapper:

B b = new B();
new IntefaceWrapper().wrap(b, HeaderHolder.class).setHeader("my header");

正如您现在看到的,您可以将 header 设置为您想要的任何类(如果它具有适当的属性)。完成后,您可以检查您的表现。当且仅当在动态代理中使用反射是瓶颈时,将实现更改为代码生成(例如,基于自定义注释、包名称等)。有很多工具可以帮助您做到这一点,或者您也可以自己实现这样的逻辑。重点是您始终可以更改 IntefaceWrapper 的实现,而无需更改其他代码。

但要避免过早优化。如今,反射非常有效。 Sun/Oracle 努力实现这一目标。例如,他们动态创建类并缓存它们以使反射更快。因此,考虑到整个流程,反射调用可能不会花费太多时间。

关于java - 在不相关的类中填充公共(public)字段的框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16593685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com