将库作为包私有导入

时间:2016-12-28 08:40:34

标签: java android

我知道我们可以在java中创建一个包私有类。所以该类是Internal,只能在指定的模块中访问:

class BookStore {
  @observable coverType = 'soft';
  @observable booksByIdMap = asMap({
    "88cd7621": {
      "id": "88cd7621",
      "title": "The Secret",
      "coverType": 'soft'
    },
    "88cd7622": {
      "id": "88cd7622",
      "title": "The Alchemist",
      "coverType": 'hard'
    },
    "88cd7623": {
      "id": "88cd7623",
      "title": "Javascript",
      "coverType": 'soft'
    },
  });

  @computed get byCoverType() {
    return this.booksByIdMap.values().filter(b => b.coverType === this.coverType);
  }
}

现在我正在开发一个名为class MyPackagePrivateClass { ... } 的Android库,我希望在我自己的LibraryA中使用现有的LibraryB。如何阻止LibraryA的用户直接使用LibraryA

是否有像打包私人图书馆这样的概念或类似内容?

更新(对于那些问我&为什么需要这个的人?')

LibraryB中有以下方法:

LibraryB

但我强烈认为我们应该使用public QueryBuilder select(String... columns); 并阻止用户将字符串传递给这些方法(考虑维护和重构问题)。所以我决定将这些方法包装在Type-Safe Enum pattern

LibraryA

因此我的库的用户应该使用我提供的Typed方法(public TypedQueryBuilder select(Column... columns) { queryBuilder = queryBuilder.select(toString(columns)); return this; } 这里是类型安全的枚举)。但是,如果他们可以使用原始方法,他们可能会使用这些方法,我倾向于禁止这一点。

3 个答案:

答案 0 :(得分:1)

在Java中,使用多态,您无法隐藏扩展类的公共方法。

我认为你可以用Facade Pattern归档你的目标:隐藏所有复杂的逻辑,在这种情况下,控制访问,如果需要,实现一些接口。

答案 1 :(得分:0)

Jigsaw project试图达到同一目标。但它可能需要很长时间才能等到它移植到Android。在此之前,IMO的最佳解决方案是使用包私有方法。用户将能够理解他不应该使用这些方法。

无论如何,最终禁止图书馆用户做某些事情是不可能的,因为人们可以使用反思或替代类来摆脱讨厌的限制。但是鼓励用户不要做某些事情是可能的 - 这是可以做的。

答案 2 :(得分:-1)

从库B中创建一个jar文件并将其导入库A.

https://stackoverflow.com/a/1051705/6897626