【发布时间】:2016-01-23 18:47:58
【问题描述】:
我正在创建一个基于 Android (Java) 的库项目 (JAR),其中有 -
- 核心功能
- 可选功能
现在由于大小限制,我必须将此 JAR 分解为 JAR 集合,该库的用户将可以灵活地包含可选 JAR。同时,要求为用户提供单一接口,使用该接口他们应该能够调用核心和可选API。为此,我想到了两种解决方案 -
解决方案-1 核心库中有接口的类实现,这里实现了与核心特性相关的API,但可选特性的API会通过反射从这里调用,所以如果找到类,则表明包含可选库,否则不包含。
APIInterface.java
public interface APIInterface {
public void coreMethod();
public void optionalMethod();
}
CoreClass.java
public class CoreClass implements APIInterface {
public void coreMethod() {
// implementation
}
public void optionalMethod() {
// use reflection to access optional method from OptionalClass
}
}
OptionalClass.java
public class OptionalClass {
public void optionalMethod() {
new CoreClass().utilityMethod(); // or super.utilityMethod();
// implementation
}
}
Pros - 这里只有 optional 包括 core(用于核心实用方法),core 不包括可选。所以没有循环依赖。
缺点 - 使用反射
解决方案 2 为避免解决方案 1 中提到的反射,请创建两个版本的可选库。首先是完整实现,第二个是空实现(仅包装器)。用户必须强制包含其中任何一个,这取决于用户是否需要可选功能。这样,依赖性将被反转。因此,core 默认会包含可选库,并且可以从可选库中调用 API 而无需反射。
APIInterface.java
public interface APIInterface {
public void coreMethod();
public void optionalMethod();
}
CoreClass.java
public class CoreClass implements APIInterface {
public void coreMethod() {
// implementation
}
public void optionalMethod() {
new OptionalClass().optionalMethod();
}
}
OptionalClass.java // 完整实现
public class OptionalClass {
public void optionalMethod() {
new CoreClass().utilityMethod(); // or super.utilityMethod();
// optional implementation
}
}
OptionalClass.java // 空实现
public class OptionalClass {
public void optionalMethod() {
// do nothing
}
}
优点 -
没有反射
缺点 -
1. core 和 optional 存在循环依赖,因为 core 包含 optional 来调用 optional API,而 optional 包含 core 使用核心实用程序和服务。
2. 用户必须强制包含可选的 JAR(完整或空实现)
您推荐哪种解决方案或其他更好的解决方案?请提出建议。
【问题讨论】:
标签: java android reflection jar circular-dependency