【问题标题】:How to split a Java library source into two blocks, keeping one package?如何将 Java 库源拆分为两个块,保留一个包?
【发布时间】:2013-10-24 16:46:00
【问题描述】:

我们正在创建一个用于 Android 的 android 库。这意味着类似 Eclipse 的 IDE 和类似 Ant 的构建过程。

库的本质是它有两个不同的部分,代表不同的抽象级别——比如说“上层”和“下层”。

假设,出于这个问题的目的,我们需要从另一部分调用方法,但希望对库用户隐藏这些方法。我已经搜索了常用的参考资料,但它们都停留在解释包名称约定和范围规则的地方。尽管this 很有用,但我在 SO 上找不到任何答案。

直接的解决方案是将所有内容简单地放在一个包中,并将这些方法设为包私有。但是,出于可维护性、清晰性和一个文件夹中没有 100 个文件的原因,我们更愿意将这些部分拆分到不同的文件夹中。

明显的拆分点是将(比如说“wibble”)包拆分为com.me.wibble.uppercom.me.wibble.lower 包/文件夹,但这会使任何互连方法都公开。为了缓解问题,可以使用 @hide 将它们从 javadoc 中隐藏起来。

另一个想法是我们是否可以在顶层拆分部分,而不是经典的 /main/test 文件夹具有 /upper/lower/test 并且所有部分共享相同的 com.me.wibble命名空间。我不确定 Eclipse 是否/如何应对。

是否有传统的方法可以做到这一点,或者只是没有这样做?如果有办法,优点和缺点是什么?

【问题讨论】:

  • 你考虑过使用reflection吗?有了它,您可以将所有方法保持私有,但将代码保存在单独的包中。
  • 哎呀!反射没有什么隐私! tutorials.jenkov.com/java-reflection/…
  • @Tanis 我不考虑反思。我的背景是 C (不会有这个原始问题 ;-) 所以我正在寻找一个“正常”的解决方案,但感谢您的建议;和警告,Pedantic。

标签: java android


【解决方案1】:

hmmm......与其要求解决方案,有时不如提出问题。为什么你希望图书馆用户有一个受限的视图可能会产生比 HOWTO 更好的答案。有几个我想到但没有给出的答案,因为我不知道问题背后的动机(我不想浪费你的时间在一个不适用的答案上)。

/upper,/lower/,/test 不会让你的情况变得更好。它只是使项目更有条理。无论它们都在同一个文件夹中还是分开,都没有太大影响。

听起来您需要为图书馆用户提供公共“界面”,同时拥有供您自己使用的私人“界面”。黑客可以做到这一点,但如果这是大量预先存在的代码集合,则可能会很痛苦。

【讨论】:

  • 我之所以要限制用户的观点背后的基本动机是有效 Java 中提出的——“区分一个设计良好的模块的最重要的一个因素是 [如何] 它隐藏了它的内部实现."。然而,这并不是一个真正正确的问题 :) 正确的问题是为什么我要分离两个可以编码为一个模块的单元?动机是帮助我们保持逻辑分离的清晰:作为一个模块进行编码可能会导致单元之间的交互混乱。你可以把这段代码看作是一个新的创造:它是一个重大的重构/重写。
  • @Cheeseminer Joshua Bloch 有一本书、一篇论文和一些关于设计(库?)API 的演讲。如果这是一项非常关键的任务,您可以考虑查看文献。我的建议是默认情况下将所有内容,甚至许多类都设为私有。您的上/下/测试文件夹可以共享命名空间。从长远来看,减少包依赖性可能会促进您的设计,但在短期内可能会非常痛苦。为了向外界公开你的类,有工厂模式和接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2010-09-27
  • 2019-05-31
相关资源
最近更新 更多