2010-08-30 183 views
0

现在是细分我正在开发的平台的时候了,我正在寻找关于如何处理跨组件依赖关系的建议。我在这里列举了很多案例,所以我会举一个例子。解决Java包依赖关系

我有一个地址类,我想使开发人员可见。它也被my.Contacts,my.Appointments和my.Location包中的类引用 - 我想分别编译它们,jar-d和交付。当然,我希望Address是一个类 - 一个Address可透明地在这些平台组件中工作。

地址应该如何打包,构建和交付?

谢谢!

回答

3

两个想法:

  1. Address听起来好像是可以在不同的交付使用,所以应该在一些共同核心库可
  2. 它可能是有意义的共同组成的组件与接口进行通信,并且可以单独提供实现(例如提供接口和AddressImpl实现)。这将减少核心库和开发人员开发的库之间的绑定数量。
+0

感谢布赖恩,对于接口建议以及 – DJC 2010-08-30 21:34:35

+0

请称它为'DefaultAddress'而不是'AddressImpl'。 '* Impl'意味着它是唯一的(也是唯一的)实现,它使得接口的使用,以及...没有意义。 '默认*'说明它是什么,默认实现。 – whiskeysierra 2010-08-30 21:40:58

2

在这种情况下,地址是一个图书馆的一部分,值得拥有自己的jar。如果您在my.Contacts,my.Appointments和my.Location中创建了一个名为Address的类,并且您想在同一应用程序中使用所有这些jar,那么您的Address类会发生冲突。

+0

感谢科林,感谢它 – DJC 2010-08-30 21:35:04

1

我建议你不要“分开”这些罐子。 Java有非常微妙的版本问题,你不想遇到。将所有东西组合在一起,并将其包装到一个或两个罐子中,并始终提供两个罐子,或将它们一起构建并提供一个罐子子集(但不会组合新的罐子和旧罐子 - 不要尝试将单个罐子作为更新)。

如果您必须单独构建它们,请注意最终常量已编译并且未引用 - 因此,如果您更改一个并提供新jar,则旧jar的任何引用都不会更新。

此外,方法签名的变化会产生奇怪的,不可预知的结果。

这听起来像你还想要一个开发者接口 - 这可能是一组接口和类,它们驻留在一个单独的jar中。如果你制作的这个jar足够好以至于你永远不需要修改它(当然,没有引用外部常量),你可能会逃避不更新它,这会让你的客户的扩展变得脆弱。

+0

谢谢Bill救了我一些痛苦:) – DJC 2010-08-30 22:55:23