为什么要分离API定义和实现JAR

时间:2017-12-28 07:41:15

标签: java api jpa api-design

对于jstl标记,API javax.servlet.jsp.jstl-api-1.2.1.jar&提供了实施javax.servlet.jsp.jstl-1.2.1.jar

对于servlet,servlet-api.jar&中的API。提供了来自 tomcat GlassFish 的实现jar。

对于馆藏,API如java.util.List&相应的实施,如java.util.ArrayList&提供了java.util.LinkedList

IDE Netbeans是另一个例子。

  1. 实现jar包括API(主要是接口)及其实现,为程序员/开发人员提供使用API​​ JAR及其相应实现(单独的JAR)的解决方案有哪些优势?

  2. 对于使用java开发企业应用程序,是否为开发人员之间的稳定合同提供API标准方法?

4 个答案:

答案 0 :(得分:2)

我主张在我的Practical API Design书中将API与其实现分开。那时我很重视simple librarymodular library方法。我们在设计NetBeans Platform API时成功使用了它们。在vendor library样式时,我常常感到不安 - 这是 Java EE 世界中常用的方法。

后来我意识到最佳解决方案取决于所需的接近程度(参见我的detailed explanation)。简而言之,这取决于 API 作者与实施 API 的人的密切关系。是同一个人吗?它是一个坐下来并且同意规范的小组吗?它们是不同的,但我们希望方式更多的库用户比实现它的人更多?或者我们是否希望几乎每个用户都在库中实现(某些东西)?这个问题的答案就会导致:

  • 无至少
  • 一对多
  • 很少很多
  • 很多很多

Proximity分类。在某些情况下,每个都可以派上用场。但是,我最喜欢的是使用全功能modular library设计的多对多方法。

答案 1 :(得分:1)

1)如果您将API放在另一个jar中,那么您可以让无法访问该实现的客户端使用它。例如:

  • 您可以从客户端的编译时类路径中排除实现,以确保API的客户端不需要任何特定的实现。

  • 您可以从API客户端的运行时类路径中排除实现(通过像Servlet这样的ClassLoader或单独的JVM),以便客户端不依赖于任何特定的实现,以便他们可以使用与实现使用的库冲突的库。

2)不是真正的个人开发者,但是使用这样的策略来避免不同开发团队之间的冲突和不必要的依赖关系是很常见的。

答案 2 :(得分:0)

这是因为只有API是标准化的,并且可能有多种实现, API是一个不完整的规范。对于servlet,除了Web App使用的servlet API之外,还有Web应用程序服务器(Tomcat或Glassfish)。应用程序服务器是一个大型程序,具有许多其他功能和API。对于Web应用程序,您的servlet不是"程序&#34 ;;应用程序服务器是。并不是您的servlet委托给服务器,服务器委托给您的代码(在WAR中)。

答案 3 :(得分:0)

在使用实现进行编程时,您可能还需要API规范(接口,抽象类等)。

Interface obj = new ClassImpletingInterface();

也可以这样做

ClassImpletingInterface obj = new ClassImpletingInterface();

如果您的程序仅使用后者,那么您可能只拥有不包含API包的实现jar。尽可能地,应该使用前者以获得更好的可维护性等。现在的问题是为什么API包不能仅捆绑到实现jar中-一个API还是一个jar。听起来可能很简单,但可能并不理想。您可能更喜欢使用从真实来源获得的javax.servelet.jsp.jstl-api软件包;没有捆绑在com.newbie.servlet-0.0.1.jar中。可能有一些法律方面阻止这种捆绑。此外,一种实现方式不一定为完整的规范提供功能。您对API的导入可能来自作为不同部分的两个不同实现,并且可能针对规范的不同发行版。在那种情况下(可能很少见),每个捆绑不同版本的API都可能引起麻烦,因为未完全定义目录中的jar搜索。因此,将API和实现捆绑到单独的jar中比较干净。