5 命名
5.1 所有标识符的通用规则
标识符仅使用 ASCII
字母和数字,以及下文提到的少数情况下的下划线。因此,每个有效的标识符名称都匹配正则表达式
\w+。
在 Google 风格中,不使用特殊前缀或后缀。例如,以下名称不符合 Google
风格:name_、mName、s_name 和 kName。
5.2 按标识符类型分类的规则
5.2.1 包名和模块名
包名和模块名仅使用小写字母和数字(不使用下划线)。连续的单词直接连在一起。例如,com.example.deepspace,而不是
com.example.deepSpace 或 com.example.deep_space。
5.2.2 类名
类名使用 UpperCamelCase(大驼峰命名法)。
类名通常是名词或名词短语。例如,Character 或
ImmutableList。接口名也可以是名词或名词短语(例如
List),但有时也可以是形容词或形容词短语(例如 Readable)。
对于注解类型的命名,没有特定的规则或公认的约定。
测试类的名称以 Test 结尾,例如
HashIntegrationTest。如果测试覆盖单个类,则其名称是该类名加上
Test,例如 HashImplTest。
5.2.3 方法名
方法名使用 lowerCamelCase(小驼峰命名法)。
方法名通常是动词或动词短语。例如,sendMessage 或 stop。
在 JUnit
测试方法名中,可以使用下划线来分隔名称的逻辑组成部分,每个部分使用
lowerCamelCase,例如
transferMoney_deductsFromSource。测试方法的命名没有唯一正确的方式。
5.2.4 常量名
常量名使用
UPPER_SNAKE_CASE(大写蛇形命名法):所有字母大写,单词之间用下划线分隔。但什么算常量呢?
常量是 static final
字段,其内容是深度不可变的,且其方法没有可检测的副作用。示例包括基本类型、字符串、不可变值类以及设置为
null
的任何值。如果实例的任何可观察状态可以改变,则它不是常量。仅仅打算不修改对象是不够的。示例:
// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Map<String, Integer> AGES = ImmutableMap.of("Ed", 35, "Ann", 32);
static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final ImmutableMap<String, SomeMutableType> mutableValues =
ImmutableMap.of("Ed", mutableInstance, "Ann", mutableInstance2);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};这些名称通常是名词或名词短语。
5.2.5 非常量字段名
非常量字段名(无论是否为静态)使用 lowerCamelCase。
这些名称通常是名词或名词短语。例如,computedValues 或 index。
5.2.6 参数名
参数名使用 lowerCamelCase。
应避免在公共方法中使用单字符参数名。
5.2.7 局部变量名
局部变量名使用 lowerCamelCase。
即使是 final 且不可变的局部变量也不被视为常量,不应使用常量的命名风格。
5.2.8 类型变量名
每个类型变量使用以下两种风格之一命名:
- 单个大写字母,可选地后跟一个数字(如
E、T、X、T2) - 以类命名方式(参见第 5.2.2
节,类名)加上大写字母
T的形式(例如:RequestT、FooBarT)。
5.3 驼峰命名法(Camel case):定义
有时将英语短语转换为驼峰命名法有多种合理的方式,例如当存在首字母缩略词或不寻常的结构(如”IPv6”或”iOS”)时。为了提高可预测性,Google 风格规定了以下(几乎)确定性的方案。
从名称的散文形式开始:
- 将短语转换为纯 ASCII 并去除所有撇号。例如,“Müller’s algorithm” 可能变为 “Muellers algorithm”。
- 将结果拆分为单词,在空格和任何剩余的标点(通常是连字符)处拆分。
- 建议:如果某个单词在常见用法中已经有了约定的驼峰形式,则将其拆分为组成部分(例如,“AdWords” 变为 “ad words”)。注意,像”iOS”这样的词实际上并不是驼峰命名法;它不符合任何约定,因此此建议不适用。
- 现在将所有内容(包括首字母缩略词)转为小写,然后仅将以下部分的首字符转为大写:
- … 每个单词,得到大驼峰命名法(UpperCamelCase),或
- … 除第一个之外的每个单词,得到小驼峰命名法(lowerCamelCase)
- 最后,将所有单词连接成一个标识符。注意,原始单词的大小写几乎完全被忽略。
在极少数情况下(例如,多部分版本号),你可能需要使用下划线来分隔相邻的数字,因为数字没有大小写变体。
示例:
| 散文形式 | 正确 | 不正确 |
|---|---|---|
| "XML HTTP request" | XmlHttpRequest | XMLHTTPRequest |
| "new customer ID" | newCustomerId | newCustomerID |
| "inner stopwatch" | innerStopwatch | innerStopWatch |
| "supports IPv6 on iOS?" | supportsIpv6OnIos | supportsIPv6OnIOS |
| "YouTube importer" | YouTubeImporterYoutubeImporter* | |
| "Turn on 2SV" | turnOn2sv | turnOn2Sv |
| "Guava 33.4.6" | guava33_4_6 | guava3346 |
*可以接受,但不推荐。
**注意:**有些单词在英语中有歧义的连字符形式:例如 “nonempty” 和
“non-empty” 都是正确的,因此方法名 checkNonempty 和 checkNonEmpty
同样都是正确的。