如何构建库项目的Java代码?

时间:2016-09-04 10:13:56

标签: java maven

我现在有多年开发Java应用程序的经验,但这是我第一次开发必须由外部开发人员使用的(Java 8)library。因此,除了API之外,我不会暴露任何东西(类,方法等)。

因此,我开始在一个软件包中实现它,并将所有内容保存在默认范围内,这只是内部的。

因为实现它需要许多类,这些类可能会分成更多的类来确保可维护性和可测试性,因此包会变得很重要。在常规项目中,我会创建大量子包来构造代码,但这是不可能的,因为这会导致内部类具有公共范围。

您是否有任何想法或知道任何方式(可能涉及构建系统(maven)或使用java 8时的其他建议)使这些代码更加结构化而不需要根据需要暴露更多类?并不是说我不能用一个包装,它只是感觉不对。

2 个答案:

答案 0 :(得分:2)

  

这将导致内部类具有公共范围。

多年来开发了这样的库,这并不像你想象的那么大,因为大多数开发人员只会使用一些记录的类和方法,而不是在你的代码中挖掘它们。意识到细节可能会随着升级而改变并破坏他们的解决方案。

简而言之,如果没有记录,大多数开发人员都不存在。

注意:如果开发人员希望进入您的代码,他们可以使用反射并将其设为私有也无关紧要。或者他们可以复制代码并对其进行修改并做任何他们喜欢的事情。

你所做的只是阻止开发人员如何进入你的代码而不是使用反射做什么,这是一个很小的数字。

  

您是否有任何想法或知道任何方式(可能涉及构建系统(maven)或其他建议)以使这些代码更加坚固?

Java 9的Jigsaw具有更强的控制力。它允许您确定将在JAR外部导出的内容。通过这种方式,您可以拥有public个成员,这些成员可以在JAR之外的任何地方使用。

答案 1 :(得分:1)

首先将所有内容保存到单个包中并不是一个好主意,因为关注点分离是一个关键概念。此外,很难在您当前的代码状态中找到公共API。

这意味着您有一个API包,其结果是具有单个模块whatever-api(工件名称),一个用于实现module-api-impl等或更多(稍后)。

这也会产生单独的包,并将代码和测试等彼此分开,并显示您需要将代码分开的位置(可能是您无意中将核心耦合在一起。

曝光事情是肯定的。当前的Java不允许这样的正确分离和API等的明确定义(也从技术角度来看)这可以从Java 9开始,您将能够通过使用适当的模块将内部事物与公共事物分开。另一种可能的方法是使用具有这种分离的OSGi,并严格区分公共API和实现。