gpt4 book ai didi

java - 对 Java 类进行分组以提高实例化清晰度的最佳实践

转载 作者:行者123 更新时间:2023-12-01 12:04:14 25 4
gpt4 key购买 nike

我正在构建一个软件,它可以使用特定的二进制定义和特定的版本发送和接收消息。因此,我的类看起来像这样,它们主要仅在包名称(在本例中为版本)方面有所不同:

对于 1.5 版本:

com.mydomain.clothesmessage.v0105.fielddefinitions.Field100
com.mydomain.clothesmessage.v0105.fielddefinitions.Field200
com.mydomain.clothesmessage.v0105.messagedefinitions.Pants
com.mydomain.clothesmessage.v0105.messagedefinitions.Socks

对于 2.7 版本:

com.mydomain.clothesmessage.v0207.fielddefinitions.Field100
com.mydomain.clothesmessage.v0207.fielddefinitions.Field200
com.mydomain.clothesmessage.v0207.messagedefinitions.Pants
com.mydomain.clothesmessage.v0207.messagedefinitions.Socks

管理这些消息的传输和接收的类使用所有版本,具体取决于消息来自何处等。

我的问题是定义类的实例需要我使用整个包路径,否则它是不明确的。即使存在我在给定文件中仅使用一个版本的情况,代码的临时读者也将无法看到正在使用的版本。 Pantsants = new Pants() 在您查看导入的包之前是不明确的。

我对此的理想用法是这样的:

V0207.Pants pantsMessage = new V0702.Pants();

这非常清楚正在使用什么版本。我可以通过创建 Pants 消息类作为 V0207 类的内部类来实现这一点,但随后 V0207 类会变得巨大(对于每个给定版本,可能有一百条消息,每条消息有 100 个字段)。是否有可能#include 内部类的方法,以便它们可以存储在单独的文件中?这将是理想的。

我想我可以用一个包装类来模拟它,它会做这样的事情(愚蠢?),其中 V0207 对象中存在 Pants 类的实例:

Object pantsMessage = V0207.pants.getClass().newInstance();
((com.mydomain.clothesmessage.v0207.messagedefinitions.Pants)pantsMessage).getZipperType();

但我不喜欢这样。它看起来很做作,并且在使用时需要 try/catch 和强制转换。太糟糕了。

我也可以使用工厂。这会好一点,但需要一个父类(或接口(interface)),并且在使用时需要强制转换,因为每个消息都有独特的方法。

Message pantsMessage = V0207Factory.newMessage(V0207.PantsMessage);
((com.mydomain.clothesmessage.v0207.messagedefinitions.Pants)pantsMessage).getZipperType();

Message sockMessage = V0207Factory.newSock();
((com.mydomain.clothesmessage.v0207.messagedefinitions.Socks)sockMessage).getSmellLevel();

你有什么想法?我使用的是 JDK 1.7,但 1.8 可能也可用。

最佳答案

考虑使用带有接口(interface)的工厂设计模式。您使用的 Java 版本并没有什么区别(尽管对 Java 7 的支持将在 Spring 停止,如果我没记错的话,是四月)。

为每个类定义一个接口(interface),其中包含将由该类的所有版本实现的方法签名。

更新您的类定义以包含适当的接口(interface)定义。

为每个需要的类创建一个类工厂,并向其传递创建该类的适当版本所需的信息。该类工厂应返回所创建类的接口(interface)类型。

这是一个例子:

测试裤

public class TestPants {
IPants pants = PantsFactory.PantsFactory(207);
Message zipperType = pants.getZipperType();
Message color = pants.getColor();
)
}

IPants

public interface IPants {
Message getZipperType();
Message getColor();
}

裤子

public class Pants implements IPants {
// Class fields and Object fields
@Override
public Message getColor () {
return null;
}
@Override
public Message getZipperType () {
return null;
}
// implement any common methods among all versions
}

裤子V0105

public class PantsV0105 extends Pants {
// add changes for this version
}

裤子V0207

public class PantsV0207 extends Pants {
// add changes for this version
}

裤子工厂

public class PantsFactory {
public static IPants PantsFactory(int version) {
switch (version) {
case 105: return new PantsV0105(); break;
case 207: return new PantsV0207(); break;
default: return null;
}
}

关于java - 对 Java 类进行分组以提高实例化清晰度的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27756559/

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