Skip to Content
Java5 命名

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 测试方法名中,可以使用下划线来分隔名称的逻辑组成部分,每个部分使用 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

这些名称通常是名词或名词短语。例如,computedValuesindex

5.2.6 参数名

参数名使用 lowerCamelCase

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

5.2.7 局部变量名

局部变量名使用 lowerCamelCase

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

5.2.8 类型变量名

每个类型变量使用以下两种风格之一命名:

  • 单个大写字母,可选地后跟一个数字(如 ETXT2
  • 以类命名方式(参见第 5.2.2 节,类名)加上大写字母 T 的形式(例如:RequestTFooBarT)。

5.3 驼峰命名法(Camel case):定义

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

从名称的散文形式开始:

  1. 将短语转换为纯 ASCII 并去除所有撇号。例如,“Müller’s algorithm” 可能变为 “Muellers algorithm”。
  2. 将结果拆分为单词,在空格和任何剩余的标点(通常是连字符)处拆分。
    • 建议:如果某个单词在常见用法中已经有了约定的驼峰形式,则将其拆分为组成部分(例如,“AdWords” 变为 “ad words”)。注意,像”iOS”这样的词实际上并不是驼峰命名法;它不符合任何约定,因此此建议不适用。
  3. 现在将所有内容(包括首字母缩略词)转为小写,然后仅将以下部分的首字符转为大写:
    • … 每个单词,得到大驼峰命名法(UpperCamelCase),或
    • … 除第一个之外的每个单词,得到小驼峰命名法(lowerCamelCase)
  4. 最后,将所有单词连接成一个标识符。注意,原始单词的大小写几乎完全被忽略。

在极少数情况下(例如,多部分版本号),你可能需要使用下划线来分隔相邻的数字,因为数字没有大小写变体。

示例:

散文形式正确不正确
"XML HTTP request"XmlHttpRequestXMLHTTPRequest
"new customer ID"newCustomerIdnewCustomerID
"inner stopwatch"innerStopwatchinnerStopWatch
"supports IPv6 on iOS?"supportsIpv6OnIossupportsIPv6OnIOS
"YouTube importer"YouTubeImporter
YoutubeImporter*
"Turn on 2SV"turnOn2svturnOn2Sv
"Guava 33.4.6"guava33_4_6guava3346

*可以接受,但不推荐。

**注意:**有些单词在英语中有歧义的连字符形式:例如 “nonempty” 和 “non-empty” 都是正确的,因此方法名 checkNonemptycheckNonEmpty 同样都是正确的。

Last updated on