5. 命名

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

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

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

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

5.2.1. 包名

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

5.2.2. 类名

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

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

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

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

5.2.3. 方法名

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

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

在JUnit测试方法名中,可以使用下划线来分隔名称的逻辑组件,每个组件都使用 小驼峰命名法 编写,例如 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. 非常量字段名

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

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

5.2.6. 参数名

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

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

5.2.7. 局部变量名

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

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

5.2.8. 类型变量名

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

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

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

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 *

*可以接受,但不推荐。

Tip

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