首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java (Android)库项目--如何设计可选模块?

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

Stack Overflow用户
提问于 2016-01-23 18:47:58
回答 1查看 807关注 0票数 1

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

  1. 核心特征
  2. 可选特性

现在,由于大小限制,我不得不将这个JAR分解为JAR集合,在这里,这个库的用户可以灵活地包含可选的JAR。同时,需要向用户提供一个单独的接口,用户应该可以使用该接口调用--核心和可选API。为了实现这一点,我想到了两个解决方案-

解决方案--1为核心库中的接口提供了类实现,其中与核心特性相关的API在这里实现,但可选特性的API将从这里使用反射调用,因此如果找到类,则指示在其他情况下不包含可选库。

APIInterface.java

代码语言:javascript
复制
public interface APIInterface {
    public void coreMethod();
    public void optionalMethod();
}

CoreClass.java

代码语言:javascript
复制
public class CoreClass implements APIInterface {
  public void coreMethod() {
    // implementation
  }
  public void optionalMethod() {
    // use reflection to access optional method from OptionalClass
  }
}

OptionalClass.java

代码语言:javascript
复制
public class OptionalClass {
  public void optionalMethod() {
    new CoreClass().utilityMethod(); // or super.utilityMethod();
    // implementation
  }
}

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

使用反反射。

解决方案-2,以避免解决方案中提到的反射-1,创建两个版本的可选库。首先是完全实现,其次是空实现(只有包装器)。用户必须强制其中任何一个,取决于用户是否需要可选的功能。这样,依赖关系就会反转。因此,core默认包括可选库,并且能够在没有反射的情况下从可选库调用API。

APIInterface.java

代码语言:javascript
复制
public interface APIInterface {
    public void coreMethod();
    public void optionalMethod();
}

CoreClass.java

代码语言:javascript
复制
public class CoreClass implements APIInterface {
  public void coreMethod() {
    // implementation
  }
  public void optionalMethod() {
    new OptionalClass().optionalMethod();
  }
}

OptionalClass.java //充分实施

代码语言:javascript
复制
public class OptionalClass {
  public void optionalMethod() {
    new CoreClass().utilityMethod(); // or super.utilityMethod();
    // optional implementation
  }
}

OptionalClass.java //空实现

代码语言:javascript
复制
public class OptionalClass {
  public void optionalMethod() {
    // do nothing
  }
}

赞成-没有反映

缺点- 1.有一个循环依赖于核心和可选,因为核心包含可选的来调用可选的API,而可选的包含核心来使用核心实用程序和服务。

  1. 用户必须强制包括可选的JAR(完全实现或空实现)。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-23 19:53:52

你可以用桥牌。为核心文件中的每个可选jar文件提供一个接口,并在可选jar中实现该接口。

代码语言:javascript
复制
// 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创建一个生成器,在这里您可以相应地设置实现。

代码语言:javascript
复制
CoreClass coreClass = new CoreClass.Builder()
    .setOptional(new OptionalImpl())
    .build();

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

代码语言:javascript
复制
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();
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34967367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档