Java (Android) 库项目 - 如何设计可选模块?

标签 java android reflection jar circular-dependency

我正在创建一个基于 Android (Java) 的库项目 (JAR),其中有 -

  1. 核心特征
  2. 可选功能

现在由于大小限制,我必须将这个 JAR 分成 JAR 集合,这个库的用户可以灵活地包含可选的 JAR。同时,要求为用户提供一个单一的界面,他们应该能够使用该界面调用核心和可选 API。为此,我想到了两个解决方案 -

解决方案-1 在核心库中有接口(interface)的类实现,与核心特性相关的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
  }
}

优点 - 这里只有可选包括核心(用于核心实用方法),核心不包括可选。所以没有循环依赖。
缺点 - 使用反射

解决方案-2 为避免解决方案 1 中提到的反射,创建两个版本的可选库。第一个是完整实现,第二个是空实现(仅包装器)。用户必须强制包含其中之一,这取决于用户是否需要可选功能。这样,依赖关系将被反转。因此,核心将默认包含可选库,并且能够从可选库调用 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
  }
}

优点 - 没有反射(reflect)
缺点 - 1. core和optional存在循环依赖,因为core包含optional调用optional API,optional包含core 使用核心实用程序和服务。
2. 用户必须强制包含可选的 JAR(完整或空的实现)

您推荐哪种解决方案或其他更好的解决方案?请提出建议。

最佳答案

您可以使用桥接模式。为核心文件中的每个可选jar文件提供一个接口(interface),并在可选jar中实现该接口(interface)。

// in the core jar file
public interface Optional {
    void optionalMethod();
}

// in the optional jar file
public class OptionalImpl implements Optional {
    public void optionalMethod() {
        // implementation
    }
}

现在,为 CoreClass 创建一个构建器,您可以在其中相应地设置实现。

CoreClass coreClass = new CoreClass.Builder()
    .setOptional(new OptionalImpl())
    .build();

在 CoreClass 中,检查是否存在实现,并相应地委托(delegate)调用。

public class CoreClass implements APIInterface {
    // is set via Builder
    private Optional optional = null; 

    public void coreMethod() {
        // implementation
    }

    public void optionalMethod() {
        if(optional != null) {
            optional.optionalMethod();
        }
    }
}

关于Java (Android) 库项目 - 如何设计可选模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34967367/

相关文章:

android - 如何将 arraylist<string> 转换为 string[]

java - 黑屏 Android 2.2 Google map v2

c# - .NET 中的动态类初始化

java - 如何从 .java 文件中获取方法列表

java - Spring Boot JAR 不包含 src 文件夹中的类

java - 如何使用maven命令检查何时成功构建

java - 使用对象的类通过反射构造对象

android - 创建版本 android apk 时出现 Proguard 异常

c# - 是否可以使用反射检索属性的变量名(而不是值)?

java - 读取整数时出错