mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
```
这些名字通常是名词或名词短语。
#### 5.2.5 非常量字段名
非常量字段名以`lowerCamelCase`风格编写。
这些名字通常是名词或名词短语。
#### 5.2.6 参数名
参数名以`lowerCamelCase`风格编写。
参数应该避免用单个字符命名。
#### 5.2.7 局部变量名
局部变量名以`lowerCamelCase`风格编写,比起其它类型的名称,局部变量名可以有更为宽松的缩写。
虽然缩写更宽松,但还是要避免用单字符进行命名,除了临时变量和循环变量。
即使局部变量是final和不可改变的,也不应该把它示为常量,自然也不能用常量的规则去命名它。
#### 5.2.8 类型变量名
类型变量可用以下两种风格之一进行命名:
* 单个的大写字母,后面可以跟一个数字(如:E, T, X, T2)。
* 以类命名方式(5.2.2节),后面加个大写的T(如:RequestT, FooBarT)。
### 5.3 驼峰式命名法(CamelCase)
[驼峰式命名法](http://zh.wikipedia.org/wiki/%E9%A7%9D%E5%B3%B0%E5%BC%8F%E5%A4%A7%E5%B0%8F%E5%AF%AB)分大驼峰式命名法(`UpperCamelCase`)和小驼峰式命名法(`lowerCamelCase`)。
有时,我们有不只一种合理的方式将一个英语词组转换成驼峰形式,如缩略语或不寻常的结构(例如"IPv6"或"iOS")。Google指定了以下的转换方案。
名字从`散文形式`(prose form)开始:
1. 把短语转换为纯ASCII码,并且移除任何单引号。例如:"Müller's algorithm"将变成"Muellers algorithm"。
1. 把这个结果切分成单词,在空格或其它标点符号(通常是连字符)处分割开。
- 推荐:如果某个单词已经有了常用的驼峰表示形式,按它的组成将它分割开(如"AdWords"将分割成"ad words")。
需要注意的是"iOS"并不是一个真正的驼峰表示形式,因此该推荐对它并不适用。
1. 现在将所有字母都小写(包括缩写),然后将单词的第一个字母大写:
- 每个单词的第一个字母都大写,来得到大驼峰式命名。
- 除了第一个单词,每个单词的第一个字母都大写,来得到小驼峰式命名。
1. 最后将所有的单词连接起来得到一个标识符。
示例:
Prose form Correct Incorrect
------------------------------------------------------------------
"XML HTTP request" XmlHttpRequest XMLHTTPRequest
"new customer ID" newCustomerId newCustomerID
"inner stopwatch" innerStopwatch innerStopWatch
"supports IPv6 on iOS?" supportsIpv6OnIos supportsIPv6OnIOS
"YouTube importer" YouTubeImporter
YoutubeImporter*
加星号处表示可以,但不推荐。
> Note:在英语中,某些带有连字符的单词形式不唯一。例如:"nonempty"和"non-empty"都是正确的,因此方法名`checkNonempty`和`checkNonEmpty`也都是正确的。
## 编程实践
### 6.1 @Override:能用则用
只要是合法的,就把`@Override`注解给用上。
### 6.2 捕获的异常:不能忽视
除了下面的例子,对捕获的异常不做响应是极少正确的。(典型的响应方式是打印日志,或者如果它被认为是不可能的,则把它当作一个`AssertionError`重新抛出。)
如果它确实是不需要在catch块中做任何响应,需要做注释加以说明(如下面的例子)。
```java
try {
int i = Integer.parseInt(response);
return handleNumericResponse(i);
} catch (NumberFormatException ok) {
// it's not numeric; that's fine, just continue
}
return handleTextResponse(response);
```
**例外**:在测试中,如果一个捕获的异常被命名为`expected`,则它可以被不加注释地忽略。下面是一种非常常见的情形,用以确保所测试的方法会抛出一个期望中的异常,
因此在这里就没有必要加注释。
```java
try {
emptyStack.pop();
fail();
} catch (NoSuchElementException expected) {
}
```
### 6.3 静态成员:使用类进行调用
使用类名调用静态的类成员,而不是具体某个对象或表达式。
```java
Foo aFoo = ...;
Foo.aStaticMethod(); // good
aFoo.aStaticMethod(); // bad
somethingThatYieldsAFoo().aStaticMethod(); // very bad
```
### 6.4 Finalizers: 禁用
极少会去重写`Object.finalize`。
> Tip:不要使用finalize。如果你非要使用它,请先仔细阅读和理解 [Effective Java](http://books.google.com/books?isbn=8131726592) 第7条款:“Avoid Finalizers”,然后不要使用它。
## Javadoc
### 7.1 格式
#### 7.1.1 一般形式
Javadoc块的基本格式如下所示:
```java
/**
* Multiple lines of Javadoc text are written here,
* wrapped normally...
*/
public int method(String p1) { ... }
```
或者是以下单行形式:
```java
/** An especially short bit of Javadoc. */
```
基本格式总是OK的。当整个Javadoc块能容纳于一行时(且没有Javadoc标记@XXX),可以使用单行形式。
#### 7.1.2 段落
空行(即,只包含最左侧星号的行)会出现在段落之间和Javadoc标记(@XXX)之前(如果有的话)。
除了第一个段落,每个段落第一个单词前都有标签``,并且它和第一个单词间没有空格。
#### 7.1.3 Javadoc标记
标准的Javadoc标记按以下顺序出现:`@param`, `@return`, `@throws`, `@deprecated`, 前面这4种标记如果出现,描述都不能为空。
当描述无法在一行中容纳,连续行需要至少再缩进4个空格。
### 7.2 摘要片段
每个类或成员的Javadoc以一个简短的摘要片段开始。这个片段是非常重要的,在某些情况下,它是唯一出现的文本,比如在类和方法索引中。
这只是一个小片段,可以是一个名词短语或动词短语,但不是一个完整的句子。它不会以`A {@code Foo} is a...`或`This method returns...`开头,
它也不会是一个完整的祈使句,如`Save the record...`。然而,由于开头大写及被加了标点,它看起来就像是个完整的句子。
> Tip:一个常见的错误是把简单的Javadoc写成`/** @return the customer ID */`,这是不正确的。它应该写成`/** Returns the customer ID. */`。
### 7.3 哪里需要使用Javadoc
至少在每个public类及它的每个public和protected成员处使用Javadoc,以下是一些例外:
#### 7.3.1 例外:不言自明的方法
对于简单明显的方法如`getFoo`,Javadoc是可选的(即,是可以不写的)。这种情况下除了写“Returns the foo”,确实也没有什么值得写了。
单元测试类中的测试方法可能是不言自明的最常见例子了,我们通常可以从这些方法的描述性命名中知道它是干什么的,因此不需要额外的文档说明。
> Tip:如果有一些相关信息是需要读者了解的,那么以上的例外不应作为忽视这些信息的理由。例如,对于方法名`getCanonicalName`,
就不应该忽视文档说明,因为读者很可能不知道词语`canonical name`指的是什么。
#### 7.3.2 例外:重写
如果一个方法重写了超类中的方法,那么Javadoc并非必需的。
#### 7.3.3 可选的Javadoc
对于包外不可见的类和方法,如有需要,也是要使用Javadoc的。如果一个注释是用来定义一个类,方法,字段的整体目的或行为,
那么这个注释应该写成Javadoc,这样更统一更友好。
## IDE 插件
### 8.1 IntelliJ IDEA
自动给出优化建议
https://github.com/alibaba/p3c/tree/master/idea-plugin
## Java 命名规范版权声明
春松客服开源社区在原文内容上有调整;原文翻译自[Google Java Style](http://google-styleguide.googlecode.com/svn/trunk/javaguide.html),
译者[@Hawstein](http://weibo.com/hawstein)。