AWS SDK for Java v2 命名约定指南:类名与测试命名的完整规范
2026/9/18 21:55:16 网站建设 项目流程

AWS SDK for Java v2 命名约定指南:类名与测试命名的完整规范

【免费下载链接】aws-sdk-java-v2The official AWS SDK for Java - Version 2项目地址: https://gitcode.com/GitHub_Trending/aw/aws-sdk-java-v2

本文是 AWS SDK for Java v2 官方开发指南(NamingConventions.md)的深度解读。它为 SDK 贡献者、代码生成器维护者以及基于 SDK 二次开发的团队提供了一套统一、可判定的命名规范:从"单数类名""缩略词按单词处理"等通用规则,到Supplier/Provider/Factory的区分,再到服务客户端Client/AsyncClient/EnhancedClient/Manager/Presigner/Utilities的完整决策树,以及测试方法名的methodToTest_when_expectedBehavior约定。读完本文,你将掌握这套命名体系的判定逻辑,并能对照仓库源码理解每个命名后缀背后的职责划分,从而在阅读、审查或扩写 SDK 代码时一眼判断一个类的角色。

一、为什么 SDK 需要一套命名约定

AWS SDK for Java v2 是一个拥有数百个模块、数千个类的巨型工程(核心基础设施位于core/,服务客户端分布在services/services-custom/)。其中绝大多数类由代码生成器(见 codegen 目录)根据服务模型自动产出,另有大量手写类承担协议解析、认证、缓存、增强 API 等职责。在没有统一规范的情况下,DynamoDBClientDynamoDbClient这类仅差大小写的命名会引发长期混乱——前者把缩写当成整体词,后者把缩写展开为驼峰单词,二者在搜索、文档、IDE 补全和代码审查中都会造成歧义。

因此官方在docs/guidelines/下制定了若干开发准则,NamingConventions.md 就是其中专门约束"名词与通用术语"如何进入类名、方法名的一份规范。它的核心思想是:命名应当是机械可判定的——给定类的职责描述,就能推出其名称;反之,给定一个名称,就能推出其职责。

二、类命名通用规则

2.1 优先使用单数类名

Prefer singular class names:SdkSystemSetting, notSdkSystemSettings.

规范要求类名优先使用单数形式。理由很直接:一个类描述的是"一件事物"的类型,而不是"一组事物"的集合;集合通常由ListSet或迭代器承载,而不是靠类名复数化来表达。

仓库中的实例 SdkSystemSetting.java 正体现了这一点:它定义的是"单个系统属性设置项"这一抽象(枚举或接口,用于读取AWS_ACCESS_KEY_ID等环境变量/系统属性),因此命名为SdkSystemSetting(单数)而非SdkSystemSettings(复数)。

2.2 缩略词按单个单词处理

Treat acronyms as a single word:DynamoDbClient, notDynamoDBClient.

对于DynamoDBSQSIAM这类缩略词,规范要求把它们当作一个普通单词来参与驼峰拼接,只有首字母大写:DynamoDbClientSqsBatchManager。不要写成全大写的DynamoDBClient

这一点对代码生成器尤其重要:服务模型中的DynamoDBS3CloudWatch等缩写会被统一规整为DynamoDbS3(保留首字母缩写)、CloudWatch形式,确保跨服务的客户端命名风格一致。读者在检索服务客户端时,也应习惯使用DynamoDbClientS3PresignerSqsAsyncBatchManager这类拼写。

三、实例化其他类的类命名:Supplier / Provider / Factory

当一个类的主要职责是"返回另一个类的实例"时,命名后缀取决于其"获取"方法的形态。规范给出了如下判定树:

判定条件命名后缀仓库实例
"get" 方法无参数,且类实现了Supplier<T>{Noun}SupplierCachedSupplier(见 CachedSupplier.java)
"get" 方法无参数,且类实现Supplier{Noun}ProviderAwsCredentialsProvider
"get" 方法有参数{Noun}FactoryAwsJsonProtocolFactory(见 AwsJsonProtocolFactory.java)

3.1 Supplier:以java.util.function.Supplier为契约

如果一个类的获取方法无参,并且类直接实现了 JDK 标准函数式接口Supplier<T>(即提供T get()),那么它就是{Noun}Supplier。仓库中的 CachedSupplier.java(位于utils模块)是一个典型实现:它包装一个值并缓存,get()在缓存过期时调用底层 supplier 重新取值,同时支持基于 Jitter 的过期策略。命名为CachedSupplier既表明了"它是个 Supplier",又表明了"它有缓存"这一附加语义。

3.2 Provider:无参获取但不实现 Supplier

如果类的获取方法同样无参数,但它不是Supplier的实现(例如方法名为resolve()credentials()或自定义的getCredentials(),返回类型与Supplier.get()不完全对齐),则使用{Noun}ProviderAwsCredentialsProvider是贯穿 SDK 认证体系的核心接口:它提供Credentials(凭证),但通过自有方法签名暴露,而非直接实现Supplier<Credentials>。相关的实现类如ProfileCredentialsProviderEnvironmentVariableCredentialsProvider等都遵循同一后缀,形成可识别的家族(可在 core/auth 模块中查看)。

3.3 Factory:获取方法带参数

当获取实例的方法带有参数(参数通常用于决定创建何种实例)时,命名为{Noun}Factory。例如 AwsJsonProtocolFactory.java(位于 core/protocols/aws-json-protocol):它根据传入的协议上下文(如序列化/反序列化配置、AwsJsonProtocolMetadata等)创建 JSON 协议的编解码器与请求处理器。因为它需要参数才能完成创建,所以是Factory而非ProviderSupplier

归纳:无参 + 实现Supplier→ Supplier;无参 + 不实现Supplier→ Provider;有参 → Factory。

四、服务特定类的命名:Client / Manager / Presigner / Utilities

对于与具体 AWS 服务绑定的类,规范按"是否发起服务调用 → 是否覆盖全部操作 → 是否代码生成 → 使用同步还是异步 HTTP"逐层判定。完整的判定树如下:

类是否发起服务调用? ├─ 是(可以调用服务的操作) │ ├─ 可以调用 *所有* contenteditable="false">【免费下载链接】aws-sdk-java-v2The official AWS SDK for Java - Version 2项目地址: https://gitcode.com/GitHub_Trending/aw/aws-sdk-java-v2

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询