【问题标题】:What is the idiomatic way to package these classes in Java在 Java 中打包这些类的惯用方法是什么
【发布时间】:2013-09-27 01:44:40
【问题描述】:

我正在编写一个包含 25 个类的库。其中 4-5 个是公共 api。其他类目前是包私有的。我的问题是我想将它们安排到自己的包中,但当前设置无法做到这一点,因为这样这些类将无法看到彼此。

所以我应该让它们保持原样而不进行安排,还是让它们全部public 以便我重新安排它们?我认为后者不是一个好的解决方案,因为很多类并不打算供最终用户使用,但我不喜欢它们只是转储到根包中,因为它只会增加大小。

java中有没有一种惯用的方法来解决这个问题?

示例:

我有一个名为HexagonalGridBuilder 的类。它是公开的并且是 api 的一部分。同样代表HexagonOrientation,它是一个枚举并保存(FLAT_TOPPOINTY_TOP)的值和HexagonalGridLayout,它也是一个枚举,并保存六角网格类型的值,如RECTANGULAR 和@ 987654328@。最终用户可以使用这些枚举参数化 HexagonalGridBuilder 对象,该对象返回一个 HexagonalGrid 这是一个接口。

所有实现类都是包私有的,如HexagonalGridImplTriangularGridLayoutStrategy。由于我描述的这个打包问题,我无法将这些类移动到不同的包中而不将它们全部设为public

【问题讨论】:

  • 举个例子。我很确定混合使用受保护和适当的包装可以解决这个问题。
  • 我认为,如果一个班级需要以不同于其他人应该能够与之交谈的方式与另一个班级交谈(包括缺乏与之交谈的能力,就像你的情况一样),它们应该在同一个包/命名空间中。

标签: java namespaces package


【解决方案1】:

除了等待 Java Project jigsaw 之外,您的解决方案还有几个变通方法:

  1. 保持包私有类的代码不变,用户不会看到这些,所以只有你会被包中的许多类所困扰。

  2. 您可以使用 my.package.internal 之类的名称创建包,但将类公开,以便其他人可以使用它们,但希望“内部”名称告诉他们不要这样做。

  3. 使用像 OSGI 这样的东西,它可以强制执行公共和私有 API,并且不会让您的 jar 旁边的其他人直接访问您不希望他们访问的类。但是,只有当您的用户也在使用 OSGI 时才会强制执行此操作。

【讨论】:

  • 我想将依赖关系保持在最低限度。事实上,目前未来用户只能遇到一个障碍:该项目使用 maven,但除此之外,不依赖于 java api 之外的任何内容。我不想设置任何障碍,所以 OSGI 不是这里的选择。
  • 我推荐上面2和3的组合。将非 API 类放在“内部”包中,并在 MANIFEST.MF 中包含 OSGi 指令,以便在将库与 OSGi 一起使用时仅导出公共包。以这种方式使您的库 OSGi 兼容不需要引入任何依赖项。 maven-bundle-plugin 甚至会帮助您生成 MANIFEST。
  • 这似乎是个好主意。我想我会阅读有关 OSGI 的内容,因为我对此了解不多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多