此处提供的接口分类法分类是为接口的开发人员和用户提供指导。该分类指导开发人员声明接口的目标受众或用户,以及其稳定性。
对接口用户的益处:了解哪些接口可以使用或不使用,以及它们的稳定性。
对开发人员的好处:防止意外更改接口,从而避免对用户或其他组件或系统造成意外影响。这在拥有众多开发人员的大型系统中特别有用,这些开发人员可能并不都具有项目的共享状态/历史记录。
Hadoop 采用以下接口分类,此分类源自 OpenSolaris 分类法,并且在一定程度上源自 Yahoo 内部使用的分类法。接口具有两个主要属性:受众和稳定性。
受众表示接口的潜在使用者。虽然许多接口对实现是内部/私有的,但其他接口是公共/外部接口,旨在供应用程序和/或客户端更广泛地使用。例如,在 posix 中,libc 是外部或公共接口,而内核的大部分是内部或私有接口。此外,某些接口针对其他特定子系统。
识别接口的受众有助于定义破坏接口的影响。例如,破坏受众为少数特定子系统的接口的兼容性可能是可以的。另一方面,破坏数百万互联网用户依赖的协议接口可能是不合适的。
Hadoop 使用以下类型的受众,按可见性增加/更广的顺序
Hadoop 没有公司私有分类,该分类适用于公司内其他项目打算使用的 API,因为它不适用于开源项目。此外,某些 API 被注释为 @VisibleForTesting(来自 com.google.common .annotations.VisibleForTesting) - 这些 API 旨在严格用于单元测试,并且应视为“私有”API。
私有接口供项目内部使用(例如 HDFS 或 MapReduce),不应由应用程序或其他项目使用。项目的大多数接口都是私有的(也称为项目私有的)。除非有意公开接口供外部使用,否则应将其标记为私有。
受限私有接口由指定的一组项目或系统(通常是密切相关的项目)使用。其他项目或系统不应使用该接口。接口的更改将与指定的项目进行沟通/协商。例如,在 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 包的受众声明为公共或私有(以及私有受众变体)非常有用。
如何为其他接口(例如 CLI)记录分类?
为什么 Java 作用域(私有、包私有和公共)不够好?
但是,如果它是 Java 公共类,我可以轻松访问私有接口。保护和控制在哪里?
为什么费心声明私有接口的稳定性?私有接口不总是处于不稳定状态吗?
应用程序使用稳定的私有接口有什么危害?它与公共稳定接口有何不同?
为什么费心使用有限私有?这不是对某些项目给予特殊待遇吗?这不公平。
让我们将所有 Private 接口都视为 Hadoop 的 Limited-Private。如果 Hadoop 系列中的项目可以访问私有类,那有什么危害?
所有 Public 接口不都是稳定的吗?