对于JSTL标记,提供了一个API javax.servlet.jsp.jstl-api-1.2.1.jar
和实施javax.servlet.jsp.jstl-1.2.1.jar
。
对servlet,提供在从Tomcat或GlassFish的servlet-api.jar
&实施罐子的API。
对于集合中,提供像java.util.List
&像java.util.ArrayList
&java.util.LinkedList
对应实现API。
IDE Netbeans是另一个例子。
我主张在我的实际API设计书分离及其实施API。当时我看重的simple library以及modular library方法。我们设计NetBeans Platform API时成功地使用他们。在Java EE的世界中使用的共同做法 - 我通常,当它来到vendor library风格感到不安。
后来我意识到了最佳的解决方案取决于接近理想程度(见我detailed explanation)。总之,它依赖于API作者是如何密切相关,谁实现了API的一个。是不是同一个人?难道坐下来商定了一个规范小组?他们是不同的,但我们预计该库的方式更多的用户比那些谁实现它?还是我们预计几乎所有用户实施库(的东西)?回答这个问题,然后导致:
Proximity分类。他们每个人都可以在某些情况下派上用场。然而,我所有的时间最喜欢的是许多与全功能modular library设计的许多方法。
1)如果你把API在不同的罐子,那么你可以让它由不能访问实现客户端使用。例如:
2)没有真正个人开发者,但它通常使用的策略一样,为了避免不同的开发团队之间的冲突和不必要的依赖。
这是因为只有该API是标准化的,并且多个实现是可能的,并且所述API是一个不完整规范。在servlet的情况下,除了servlet的API,你的Web应用程序使用,有Web应用程序服务器(Tomcat或Glassfish的)。应用服务器是一个大项目,与许多其他的功能和API。对于Web应用程序,你的servlet是不是“程序”;应用程序服务器。这并不是说你的servlet委托给服务器,服务器委托给你的代码(在WAR)。
在程序设计中使用的实现,你可能需要的API规范(接口,抽象类等)了。
Interface obj = new ClassImpletingInterface();
这也可作为进行
ClassImpletingInterface obj = new ClassImpletingInterface();
如果你的程序只使用了后者,你可能会离开其只是实现JAR没有包括的API包。尽可能,应该使用前者为更好的可维护性等,现在为什么不能在API包刚刚被捆绑到实现JAR的问题 - 一个API一个罐子。听起来简单,但可能不理想。你可能更愿意使用从真实来源获得的javax.servelet.jsp.jstl-api
包;在com.newbie.servlet-0.0.1.jar
不捆绑。可以有法律方面的问题,以防止这样的捆绑。此外,实施未必能提供完整的规范功能。你进口的API可能来自两个不同的实现方式不同的部分,他们可以对不同规格的版本级别。在这种情况下,也许是罕见的,API的每个捆绑不同的版本级别可能会因在目录中搜索罐子没有完全定义的麻烦。因此,API和实现捆绑成单独的罐子是清洁的。