gpt4 book ai didi

具有泛型类型的 Java 工厂

转载 作者:行者123 更新时间:2023-11-30 05:44:27 28 4
gpt4 key购买 nike

我正在为我的大学做一个项目,但遇到了问题。

基本上,该项目由一个客户端-服务器应用程序组成,我想创建一个用于通信的 Packet 类。数据包由 header 和主体组成。现在问题来了。我可以有一些不同类型的主体,但它们都继承通用类 Body。

我的想法是制作一个像这样的 Packet 类:

public class Packet <T extends Body>{
private Header header;
private T body;
}

和一个像这样的 Header 类:

public class Header {
private OPS op;
}

现在我想要一种工厂,当我从服务器的 main 调用方法 Factory.createPacket() 时,它会以这种方式构建一个数据包:

  1. 从 SocketChannel 读取 header
  2. 根据 header 字段,它将读取该类型的正文

例如,如果它在 header 上读取了 CREATE(一种 OPS)操作,那么它应该读取 CreateBody(继承 Body)

此外,每个主体都必须有一个函数,允许从 SocketChannel 获取该类型的主体,这就是我考虑使用泛型的原因。

有人可以告诉我更好的方法吗?

谢谢大家!

最佳答案

不确定您是否真的想在这里使用泛型。如果你全力以赴,这只会对你有帮助。如果您走这条路,您的最终目标应该是依靠编译器来检测何时混合一些 Header Body 类型错误。这意味着 Header也应该参数化。

您的Header最终决定 Body类型。由于它嵌入了这些知识,因此最好将这些信息提供给类型系统,即 Header<T extends Body> .

要实现此功能,您需要以某种方式找出此类型 T从 header 内,基于 OPS实例。所以OPS本身需要是参数化类型。

如果OPSenum ,它不能被参数化,因此不能以类型安全的方式完成(即在某些时候没有显式转换);所以你必须添加一个方法,例如:

Class<? extends Body> bodyType();

所以每个 OPS实例将在内部绑定(bind)到主体类型(但您不能使其可见)。有人需要将其转换到特定的体型上;那可能是你的Header :

class Header<T extends Body> {
private final Class<T> bodyType;
public Header(OPS ops) {
// any type-safety feeling gets blown here!
this.bodyType = (Class<T>) ops.bodyType();
}
// ...
}

保证其安全的唯一方法是使 OPS其本身参数化为OPS<T extends Body>并手动实例化每个 OPS 类型(因为枚举不支持这一点)。

<小时/>

如果这看起来很麻烦,那是故意的。它的主要目的是阻止您使用泛型,因为我猜测您在这里确实不需要它们。要验证这一点,请在代码中查找声明为 Packet<SpecificBodyType> 的任何引用。如果它只是Packet,那么它的使用效果就不会那么好。 .

鉴于您可以治疗任何 Body子类型作为顶级 Body抽象,OPS可以绑定(bind)到特定的Body子类(内部),如上所述:Class<? extends Body> bodyType(); 。因此,您可以在实际需要的地方在运行时使用该特定类。

或者,OPS可能是Function<SocketChannel, Body> ,所以它会自行决定哪个 Body每个 apply() 中使用的子类型执行。但你的程序中没有其他人需要关心具体的Body子类型,如果:

  1. 编译时实际上并不需要它们
  2. 需要付出很大的努力来重构您的代码,以在 OPS 之间建立链接。可供编译器检查的类型和主体类型。

关于具有泛型类型的 Java 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55090979/

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