此处提供的接口分类法旨在为接口的开发者和用户提供指导。该分类法引导开发者声明接口的目标受众或用户群体,以及其稳定性。
用户使用接口的好处:了解哪些接口可以使用或避免使用,以及它们的稳定性。
对开发者的好处:防止接口的意外变更,从而避免对用户或其他组件或系统造成意外影响。这在拥有众多开发者的大型系统中尤为有用,因为开发者们可能并不都了解项目的共享状态/历史。
Hadoop采用以下接口分类,该分类源自OpenSolaris的分类法,并在某种程度上参考了雅虎内部使用的分类法。接口具有两个主要属性:受众群体和稳定性。
受众(Audience)表示该接口的潜在使用者。许多接口是内部/私有实现,而其他则是面向应用程序和/或客户端更广泛使用的公共/外部接口。例如在POSIX中,libc属于外部或公共接口,而内核的大部分属于内部或私有接口。此外,某些接口专门面向其他特定子系统。
明确界面的受众有助于评估其变更带来的影响。例如,如果某个界面的受众仅限于少数特定子系统,那么破坏其兼容性可能是可以接受的。反之,若某个协议界面被数百万互联网用户所依赖,破坏其兼容性则很可能不可取。
Hadoop 按照可见性递增/范围扩大的顺序使用以下类型的受众:
Hadoop没有公司私有分类,该分类适用于公司内部其他项目使用的API,因为它不适用于开源项目。此外,某些API被标注为@VisibleForTesting(来自com.google.common.annotations.VisibleForTesting)——这些API严格用于单元测试,应被视为"私有"API。
Private接口仅供项目内部使用(例如HDFS或MapReduce),不应被应用程序或其他项目调用。项目中的大多数接口都属于Private类型(也称为项目私有接口)。除非某个接口是专门设计给外部使用的,否则都应标记为Private。
受限私有接口由一组指定的项目或系统使用(通常是紧密相关的项目)。其他项目或系统不应使用该接口。对该接口的更改将与指定项目进行沟通/协商。例如,在Hadoop项目中,某些接口被标记为LimitedPrivate{HDFS, MapReduce},表示它们专属于HDFS和MapReduce项目。
公共接口可供任何应用程序通用。
API的变更可分为两大类:兼容性和非兼容性。兼容性变更指符合以下标准的变更:
任何不符合这三项标准的更改都是不兼容的更改。简而言之,兼容性更改不会破坏现有客户端。以下是兼容性更改的示例:
这些示例是不兼容的变更:
稳定性表示接口的稳定程度,以及何时允许对接口进行兼容和不兼容的更改。Hadoop API具有以下稳定性级别。
稳定接口作为首选的通信方式对外公开。稳定接口预计不会在主版本发布中进行不兼容的更改,因此可作为安全的开发目标。稳定接口可能会在次版本发布之间进行兼容性演进。
允许的不兼容变更:主版本号 (X.0.0) 允许的兼容变更:维护版本号 (x.y.Z)
演化接口通常会被公开,以便用户或外部代码能在功能稳定前使用它。然而,接口"最终"应趋于稳定并升级为稳定版这一预期,并不是将该接口标记为演化版的必要条件。
不兼容的变更仅允许在次要版本发布时对演进接口进行。
允许的不兼容变更:次要版本 (x.Y.0) 允许的兼容变更:维护版本 (x.y.Z)
不稳定接口是指不提供兼容性保证的接口。不稳定接口并不一定意味着它本身不稳定。通常,暴露不稳定接口是因为用户或外部代码需要访问一个并非设计为公开使用的接口。将该接口标记为不稳定接口是为了明确声明:尽管该接口已公开暴露,但它并非首选的访问路径,且不对其提供任何兼容性保证。
除非有理由对接口提供兼容性保证,无论其是否公开,都应标记为不稳定。在大多数情况下,私有接口也应标记为不稳定。
对不稳定接口的不兼容更改随时可能发生。
允许的不兼容变更:维护版本 (x.y.Z) 允许的兼容变更:维护版本 (x.y.Z)
已弃用的接口未来可能会被移除,不应继续使用。即便如此,已弃用的接口在被移除前仍可正常使用。一个已弃用接口何时能被移除取决于它是否同时属于稳定、演进或不稳定状态。
Hadoop API的分类将如何记录?
每个接口或类都会使用org.apache.hadoop.classification包中的注解来记录其受众群体和稳定性。
由maven目标javadoc:javadoc生成的javadoc仅列出了公共API。
可以通过Java类和Java接口所在包的受众范围来推断它们的受众范围。因此,为每个Java包声明其受众范围是公开(public)还是私有(private)(包括私有受众的变体)非常有用。
其他接口(如CLI)的分类将如何记录?
为什么Java的作用域(private、package private和public)还不够好?
但如果它是Java公共接口,我可以轻松访问私有接口。保护和控制在哪里?
为什么要费心声明私有接口的稳定性?私有接口不总是非稳定的吗?
应用程序使用稳定的私有接口有什么危害?它与公共稳定接口有何不同?
为什么要费心搞有限私有化?这不是给某些项目特殊待遇吗?这不公平。
让我们将Hadoop中所有私有接口视为有限私有。如果Hadoop家族中的项目能够访问私有类,会有什么危害?
并非所有公共接口都是稳定的吗?