首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么将API定义和实现JARs分开?

为什么将API定义和实现JARs分开?
EN

Stack Overflow用户
提问于 2017-12-28 07:41:15
回答 4查看 1.2K关注 0票数 4

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

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

对于集合,提供了API (如java.util.List )和相应的实现(如java.util.ArrayListjava.util.LinkedList )。

IDE Netbeans是另一个例子。

  1. 实现jar既包括API (主要是接口),也包括它的实现,为程序员/开发人员提供使用API及其相应实现(单独JAR)的解决方案有哪些优点?
  2. 对于使用java开发企业应用程序,提供API是开发人员之间稳定契约的标准方法吗?
EN

回答 4

Stack Overflow用户

发布于 2018-01-03 09:42:00

在我的实用API设计书中,我一直主张将API与其实现分开。当时,我对简单图书馆模块库方法都很重视。在设计NetBeans平台 API时,我们成功地使用了它们。谈到供应商库风格时,我通常会感到不安--这是Java 世界中使用的一种常见方法。

后来,我意识到最优的解决方案取决于期望的邻近的程度(参见我的详细解释)。简而言之,这取决于API作者与实现API的作者之间的关系有多密切。是同一个人吗?是一群坐下来商定规格的人吗?它们是不同的,但是我们期望库的用户比那些实现它的用户多得多?还是我们期望几乎每个用户都实现(在库中)某些东西?然后,这一问题的答案会导致:

  • 对许多人来说没有
  • 一对多
  • 少之又多
  • 多对多

接近性分类在某些情况下,每一种方法都很方便。然而,我一直以来最喜欢的方法是有很多很多功能齐全的模块库设计。

票数 3
EN

Stack Overflow用户

发布于 2017-12-28 21:43:35

1)如果将API放在不同的jar中,则不能访问实现的客户端可以使用它。例如:

  • 您可以从客户端的编译时类路径中排除实现,以确保API的客户端不需要任何特定的实现。
  • 您可以将实现排除在API客户端的运行时类路径中(可以通过ClassLoaders (比如servlets ),也可以单独使用JVM),这样客户端就不能依赖于任何特定的实现,从而可以使用与实现使用的库冲突的库。

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

票数 2
EN

Stack Overflow用户

发布于 2017-12-28 08:58:59

这是因为只有API是标准化的,多个实现是可能的,而API是一个不完整的规范。对于servlet,除了Web应用程序使用的servlets之外,还有web应用服务器(Tomcat或Glassfish)。应用服务器是一个大型程序,具有许多其他特性和API。对于Web应用程序,您的servlet不是“程序”,而是应用程序服务器。不是您的servlet委托给服务器,而是服务器委托给您的代码(在WAR中)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48003567

复制
相关文章

相似问题

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