4.10.6. 5. 命名

4.10.6.1. 5.1. 所有标识符通用的规则

标识符只使用ASCII字母、数字以及在下面提到的极少数情况中才会使用的下划线。因此,每个有效的标识符名称都应与正则表达式 \w+ 匹配。

在Google风格中, 使用特殊的前缀或后缀。例如,以下都不是Google风格的命名: name_mNames_namekName

4.10.6.2. 5.2. 不同类型标识符的规则

4.10.6.2.1. 5.2.1. 包名

包名只使用小写字母和数字(不使用下划线)。连续的单词直接连接在一起。例如 com.example.deepspace ,而不是 com.example.deepSpacecom.example.deep_space

4.10.6.2.2. 5.2.2. 类名

类名使用 大驼峰命名法(UpperCamelCase)

类名通常是名词或名词短语。例如 CharacterImmutableList 。接口名称也可能是名词或名词短语(例如 List ),但有时可能是形容词或形容词短语(例如 Readable )。

对于注解的命名,至今还没有具体的规则,甚至也没有任何不成文的规定。

测试类的名称以 Test 结尾,例如, HashIntegrationTest 。如果它覆盖一个单一的类,其名称是该类的名称后加上 Test,例如 HashImplTest

4.10.6.2.3. 5.2.3. 方法名

方法名使用 小驼峰命名法(lowerCamelCase)

方法名通常是动词或动词短语。例如 sendMessagestop

在JUnit测试方法名中,可以使用下划线来分隔名称的逻辑组件,每个组件都使用 小驼峰命名法 编写,例如 transferMoney_deductsFromSource 。命名测试方法没有唯一正确的方式。

4.10.6.2.4. 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"};

常量名通常是名词或名词短语。

4.10.6.2.5. 5.2.5. 非常量字段名

非常量字段名,无论其是否为静态的,都使用 小驼峰命名法 格式编写。

非常量字段名通常是名词或名词短语。例如, computedValuesindex

4.10.6.2.6. 5.2.6. 参数名

参数名使用 小驼峰命名法 格式编写。

公共( public)方法中应避免使用单字符参数名。

4.10.6.2.7. 5.2.7. 局部变量名

局部变量名使用 小驼峰命名法 格式编写。

即使是 final 且不可变的,局部变量也不被视为常量,因此不应按常量的风格命名。

4.10.6.2.8. 5.2.8. 类型变量名

每个类型变量的命名方式有两种:

  • 单个大写字母,后面可选择性地跟一个数字(如 E , T , X , T2

  • 按照类的命名方式命名(参见第5.2.2节,类名),然后跟一个大写字母 T (例如: RequestT , FooBarT )。

4.10.6.3. 5.3. 驼峰命名法:明确规定

有时将英文短语转换为驼峰命名有多种合理的方式,例如当存在缩略词或如”IPv6”或”iOS”这样不寻常的结构时。为了提高可预测性,Google风格指定了以下的(几乎)明确的规定。

从名称的口头表达开始:

    1. 将短语转换为纯ASCII并去除所有的撇号。例如,“Müller’s algorithm”可能变为“Muellers algorithm”。

    1. 将这个结果分割为单词,以空格和任何剩余的标点符号(通常是连字符)为分隔。

    • 推荐:如果任何单词在常见用法中已经有一个传统的驼峰命名形式,那么将其分割成其组成部分(例如,”AdWords”变为”ad words”)。注意,像”iOS”这样的单词并不真的是驼峰命名,实际上它违反了任何惯例,所以这个建议不再适用。

    1. 现在将所有内容(包括缩略词)全部转为小写,然后只将:

    • … 每个单词的第一个字母大写,得到大驼峰命名,或

    • … 除第一个单词外的每个单词的第一个字母大写,得到小驼峰命名

    1. 最后,将所有的单词连接成一个标识符。

注意,原始单词的大小写几乎完全被忽略。示例:

口头表达

正确形式

错误形式

“XML HTTP request”

XmlHttpRequest

XMLHTTPRequest

“new customer ID”

newCustomerId

newCustomerID

“inner stopwatch”

innerStopwatch

innerStopWatch

“supports IPv6 on iOS?”

supportsIpv6OnIos

supportsIPv6OnIOS

“YouTube importer”

YouTubeImporterYoutubeImporter *

*可以接受,但不推荐。

小技巧

注意: 在英文中,有些单词的连字符使用是模糊的:例如,“nonempty”和“non-empty”都是正确的,因此方法名 checkNonemptycheckNonEmpty 同样都是正确的。