【发布时间】:2015-01-03 15:45:54
【问题描述】:
我正在构建一个软件,它以特定二进制定义和特定版本发送和接收消息。因此,我有看起来像这样的类,它们的变化主要在于包名称(在这种情况下是版本):
对于 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
管理这些消息的传输和接收的类使用所有版本,具体取决于消息的来源等。
我的问题是定义类的实例需要我使用整个包路径,否则它会模棱两可。即使存在我在给定文件中仅使用一个版本的情况,代码的普通读者也无法看到正在使用的版本。 Pants pants = 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();
但我不喜欢那样。它看起来很做作,在使用时需要尝试/捕获和强制转换。太可怕了。
我也可以使用工厂。这会更好一些,但需要一个父类(或接口),并且在使用时需要强制转换,因为每条消息都有唯一的方法。
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 可能可用。
【问题讨论】:
-
将版本号放在类的构造函数 Javadoc 中。这样,当您将鼠标悬停在构造函数上时,注释将显示版本号。如果您需要每个方法的版本号,您可以创建一个预编译过程,将版本号放在每个方法 Javadoc 上。
-
是的,构造函数和类的 Javadoc 肯定会包含版本。但这确实需要 IDE 和启动 Javadoc 的操作。此外,这仅解决了问题的一小部分。我真的不想在实例化对象时指定整个包路径。
标签: java inner-classes organization