对于代码规范,我是一个有洁癖的人,尤其是在 html 页面中更加注重。公司有几个哥们,写代码完全不按常理出牌,最简单的代码缩进都懒得去做,更别说美观了,每次修改bug都让人很头疼,读他们的代码就像是在吃黄连。尤其是我这种有代码洁癖的人,第一眼看上去,必然会在心里骂爹骂娘的(我去年买了个表)。今天这篇文章我们就来说说大神们的代码规范。

命名

包名: 包名一般都是用公司的域名反着来写的,最后是业务名称,通用小写字母,连续的单词只是简单地连接起来,不使用下划线,例如: com.google.XXX.action
文件名:源文件以其最顶层的类名来命名,大小写敏感,文件扩展名为 .java 名称与业务相关。源文件编码格式为 utf-8 .
类名: 类的名字必须由大写字母开头而单词中的其他字母均为小写;如果类名称由多个单词组成,则每个单词的首字母均应为大写例如TestPage;如果类名 称中包含单词缩写,则这个所写词的每个字母均应大写,如:XMLExample,还有一点命名技巧就是由于类是设计用来代表对象的,所以在命名类时应尽量选择名词。例如: User
方法名:方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头,使用驼峰命名法。例如: sendMessge()
常量名:常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。 例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// good
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(','); // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

// bad
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 Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};

属性名:参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请在尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。
驼峰式命名法(CamelCase):
驼峰式命名法分大驼峰式命名法(UpperCamelCase)和小驼峰式命名法(lowerCamelCase)。 有时,我们有不只一种合理的方式将一个英语词组转换成驼峰形式,如缩略语或不寻常的结构(例如”IPv6”或”iOS”)。Google指定了以下的转换方案。

名字从散文形式(prose form)开始:

  • 把短语转换为纯ASCII码,并且移除任何单引号。例如:”Müller’s algorithm”将变成”Muellers algorithm”。
  • 把这个结果切分成单词,在空格或其它标点符号(通常是连字符)处分割开。
    推荐:如果某个单词已经有了常用的驼峰表示形式,按它的组成将它分割开(如”AdWords”将分割成”ad words”)。 需要注意的是”iOS”并不是一个真正的驼峰表示形式,因此该推荐对它并不适用。

  • 现在将所有字母都小写(包括缩写),然后将单词的第一个字母大写:

    • 每个单词的第一个字母都大写,来得到大驼峰式命名。
    • 除了第一个单词,每个单词的第一个字母都大写,来得到小驼峰式命名。
  • 最后将所有的单词连接起来得到一个标识符。
    例如:
    1
    2
    3
    4
    5
    6
    7
    8
    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*

javadoc注释: Java除了可以采用我们常见的注释方式之外,Java语言规范还定义了一种特殊的注释,也就是我们所说的Javadoc注释,它是用来记录我们代 码中的API的。Javadoc注释是一种多行注释,以结束,注释可以包含一些HTML标记符和专门的关键词。使用Javadoc 注释的好处是编写的注释可以被自动转为在线文档,省去了单独编写程序文档的麻烦。例如:

1
2
3
4
5
/**
* Multiple lines of Javadoc text are written here,
* wrapped normally...
*/
public int method(String p1) { ... }

至少在每个public类及它的每个public和protected成员处使用Javadoc,

编码规范

package语句: package 语句不换行,(即package语句写在一行里)
import语句: 一般不使用通配符,即:import java.util.*;
import语句不换行(每个import语句独立成行)。
缩进: 缩进一个 tab
大括号: 大括号与if, else, for, do, while语句一起使用,即使只有一条语句(或是空),也应该把大括号写上。

1
2
3
4
5
if(value){
...
} else {
...
}

列限制: 80或100,一个项目可以选择一行80个字符或100个字符的列限制,除了下述例外,任何一行如果超过这个字符数限制,必须自动换行。自动换行时,第一行后的每一行至少比第一行多缩进4个空格。
数组: 以下写法都是OK的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
new int[] {
0, 1, 2, 3
}
new int[] {
0,
1,
2,
3
}
new int[] {
0, 1,
2, 3
}
new int[]
{0, 1, 2, 3}

switch语句:在一个switch块内,每个语句组要么通过break, continue, return或抛出异常来终止,要么通过一条注释来说明程序将继续执行到下一个语句组, 任何能表达这个意思的注释都是OK的(典型的是用// fall through)。这个特殊的注释并不需要在最后一个语句组(一般是default)中出现。示例:

1
2
3
4
5
6
7
8
9
10
11
switch (input) {
case 1:
case 2:
prepareOneOrTwo();
// fall through
case 3:
handleOneTwoOrThree();
break;
default:
handleLargeNumber(input);
}

注解(Annotations):注解紧跟在文档块后面,应用于类、方法和构造函数,一个注解独占一行。这些换行不属于自动换行(第4.5节,自动换行),因此缩进级别不变。例如:

1
2
3
@Override
@Nullable
public String getNameIfPresent() { ... }

注释:块注释与其周围的代码在同一缩进级别。它们可以是/* ... */风格,也可以是// ...风格。对于多行的/* ... */注释,后续行必须从*开始, 并且与前一行的*对齐。以下示例注释都是OK的。

1
2
3
4
/*
* This is // And so /* Or you can
* okay. // is this. * even do this. */
*/

捕获的异常:不能忽视

除了下面的例子,对捕获的异常不做响应是极少正确的。(典型的响应方式是打印日志,或者如果它被认为是不可能的,则把它当作一个AssertionError重新抛出。)

如果它确实是不需要在catch块中做任何响应,需要做注释加以说明(如下面的例子)。

1
2
3
4
5
6
7
8
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,则它可以被不加注释地忽略。下面是一种非常常见的情形,用以确保所测试的方法会抛出一个期望中的异常, 因此在这里就没有必要加注释。

1
2
3
4
5
try {
emptyStack.pop();
fail();
} catch (NoSuchElementException expected) {
}

ddAnswer

更多文章请关注微信公众号: zhiheng博客