如何从不同的包中调用api方法而没有额外的依赖?

时间:2012-08-04 13:09:59

标签: java android design-patterns modularity api-design

假设:
我有一个Java / Android模块化库,可以像这样设置:

package com.mycorp.app.sample.integration;
public class ModuleConnector {

    public static final LogcatLogger   LOGCAT_LOGGER              
        = new LogcatLoggerImpl.Configurator("TEST")
              .verbosity(LogcatLoggerImpl.Verbosity.VERBOSE)
              .replace("ApiDesign", "Design")
              .replace("Sample", "Sample")
              .createInstance();

    public static final JsonWebservice GET_INFORMATION_WEBSERVICE
        = new JsonWebserviceImpl.Configurator()
              .logger(LOGCAT_LOGGER)
              .enableCaching(true)
              .endpoint("http://test.com")
              .createInstance();
}


问题:
当前依赖关系图显示: has no dependency. it's ok

添加此代码后显示如下

package com.mycorp.app.sample.global;
public class G extends Application {

    static {
        ModuleConnector.GET_INFORMATION_WEBSERVICE.request(null);
    }
}


我想防止明显的依赖: the problem

备注:

  • ModuleConnector位于com.mycorp.app.sample.integration
  • com.mycorp.app.sample.global可以是每个客户端包。
  • 我想使用com.mycorp.app.sample.integration来访问模块 的API
  • 我有很多api方法,所以我更喜欢不使用 命令/策略模式

2 个答案:

答案 0 :(得分:0)

这是一个谜题吗?您的代码不显示依赖项。是编译时还是运行时依赖?什么样的分析产生了你的图表?

根据您提供的信息,无法确定依赖关系是什么,以及如何防止它。

答案 1 :(得分:0)

情景不是很清楚......但我想提出一些想法

也许你想要删除这个直接的依赖关系,这样你就可以把你的lib作为单独的jar文件提供......在这种情况下你可以把一些包装器放在“集成”模块中

App - >集成/插件模块 - >你的图书馆模块

就像,当你调用ModuleConnector类时,你需要在静态方法中初始化它,所以你的开发人员必须知道,“在使用ModuleConnector之前,我必须用静态方法初始化它......我不能忘记“....如果想要删除这种依赖,那么你可以提供

  package com.mycorp.app.sample.integration;

  Class ApplicationModuleConnector  {
    ModuleConnector connector;
    static {
       //do something
    }

    //this method will be called by you developer, he need not to bother about init() of ModuleConnector
    public invokeWebservice() {}
  }