我知道我们可以在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;
}
这里是类型安全的枚举)。但是,如果他们可以使用原始方法,他们可能会使用这些方法,我倾向于禁止这一点。
答案 0 :(得分:1)
在Java中,使用多态,您无法隐藏扩展类的公共方法。
我认为你可以用Facade Pattern归档你的目标:隐藏所有复杂的逻辑,在这种情况下,控制访问,如果需要,实现一些接口。
答案 1 :(得分:0)
Jigsaw project试图达到同一目标。但它可能需要很长时间才能等到它移植到Android。在此之前,IMO的最佳解决方案是使用包私有方法。用户将能够理解他不应该使用这些方法。
无论如何,最终禁止图书馆用户做某些事情是不可能的,因为人们可以使用反思或替代类来摆脱讨厌的限制。但是鼓励用户不要做某些事情是可能的 - 这是可以做的。
答案 2 :(得分:-1)
从库B中创建一个jar文件并将其导入库A.