1命名规范
1.1 package (*)
包名全部由小写的ASCII字母组成,用“.”分隔。
在此项目中,所有的包均以“com.prosten.ticket”开头。
1.2 class (*)
类名应当是名词,每个内部单词的头一个字母大写。应当使你的类名简单和具有说明性。用完整的英语单词或约定俗成的简写命名类名。
【示例】public class UserManager
1.3 interface(*)
接口名应当是名词,每个内部单词的头一个字母大写。应当使你的接口名简单和具有说明性。用完整的英语单词或约定俗成的简写命名接口名。
【示例】interface TicketManagement
1.4 Class 成员属性及变量的命名 (*)
变量名全部由字母组成,头一个字母小写,以后每个内部单词的头一个字母大写。
变量名应该短而有意义。变量名的选择应该易于记忆。
一个字符的变量名应避免,除非用于临时变量。通常临时变量名的命名规则为:i,j,k,m,n用于整数;c,d,e用于字符。
【示例】private String lastName;
1.5 常量的命名(*)
Java 里的常量,是用static final 修饰的,应该用全大写加下划线命名,并且尽量指出完整含义。
【示例】static final String SMTH_BBS="bbs.tsinghua.edu.cn";
1.6 数组的命名(*)
数组应该总是用下面的形式来命名:
byte[] buffer;
1.7 方法的参数(*)
和变量的命名规范一致,且应使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字。
【示例】setCounter(int size){
this.size = size;
}
1.8 方法命名(*)
方法的命名应当使用动词,头一个字母小写,以后每个内部单词的头一个字母大写。
在方法名的选择上应意义明确便于记忆。
对于属性的存取方法,应使用getXXX()和setXXX()名称,以isXXX(),hasXXX()来命名返回值为boolean 类型的方法。
1.9 一般命名注意事项
用有意义的名字命名变量
首先,用完整的英语单词或约定俗成的简写命名变量。
【示例】firstName
zipCode
用复数命名Collection 类变量。Collection 包括数组,Vector 等。命名时使用复数:
【示例】customers
classmates
2 Java 源文件样式
Java(*.java) 源文件应遵守如下的样式规则:
2.1 Class 代码布局:
版权声明
Package和Import语句
Javadoc 注释或者其它文件头注释
类或接口声明
Fields 声明
空行
构造函数
空行
克隆方法
空行
其它方法(不包括main)
空行
内部(Inner)类
空行
main()方法
2.2 版权声明
所有的源文件都应该以一个c风格的注释开始,以列出类名,版本信息,修改日期和版权声明。
【示例】/*
* Class name :
*
* Version information :
*
* Date :
*
* Copyright 2003 Prosten Technology Co.,Ltd.
*
*/
其他不需要出现在 javadoc 的信息也可以包含在这里。
2.3 Package/Imports(*)
package 行要在 import 行之前,中间空一行。
将import 的classes 归类,按顺序罗列:
a. Java 标准类(java.*)
b. Java 扩充类(javax.*)
c. 第三方类
d. 你的应用程序的类
注意在第三方类里进行注释,说明它们的来源。如果 import 行中包含了同一个包中的多个类,则可以用 * 来处理。
【示例】package com.prosten.ticket.ticketmanagement;
import java.io.*;
import java.util.Observable;
import java.util.Date;
import javax.sql.*;
//Apache Xerces
import org.apache.xml.*;
import org.apache.xerces.dom.*;
//Application classes
import com.prosten.util.*;
这里 java.io.* 使用来代替InputStream 和 OutputStream 的引入。
2.4 Javadoc 注释
【示例】/**
* <p>Title: 类名</p>
* <p>Description:(说明用中文)/</p>
* @author:
* @date:(最后一次修改的提交时间)
*/
2.5 Class Fields
类的成员变量:
【示例】protected int[] packets;
public 的成员变量必须以生成文档(JavaDoc) 的方式进行注释(/** … */)。
proceted、private 和 package 定义的成员变量如果名字含义明确的话,可以没有注释。
Field 定义可遵从以下顺序:
a. public 常量
b. public 变量
c. protected 常量
d. protected 变量
e. package 常量
f. package 变量
g. private 常量
h. private 变量
2.6 存取方法(getter,setter)
接下来是类变量的存取的方法。
2.7 构造方法(*)
重载的构造方法应该用递增的方式写(参数多的写在后面)。
【示例】public CounterSet(){
this(10);
}
public CounterSet(int size){
this.size = size;
}
2.8 克隆方法
如果这个类是可以被克隆的,就应实现 clone 方法:
【示例】public Object clone() {
try {
CounterSet obj = (CounterSet)super.clone();
obj.packets = (int[])packets.clone();
obj.size = size;
return obj;
}catch(CloneNotSupportedException e) {
throw new InternalError("Unexpected CloneNotSUpportedException: "
+ e.getMessage());
}
}
2.9 类方法
下面开始写类方法:
【示例】/**
* Set the packet counters
* (such as when restoring from a database)
*/
protected final void setArray(int[] r1, int[] r2, int[] r3, int[] r4)
throws IllegalArgumentException {
if (r1.length != r2.length || r1.length != r3.length
|| r1.length != r4.length) {
throw new IllegalArgumentException("Arrays must be he same size");
}
System.arraycopy(r1, 0, r3, 0, r1.length);
System.arraycopy(r2, 0, r4, 0, r1.length);
}
2.10 toString 方法
每一个类都最好定义 toString 方法:
【示例】public String toString() {
String retval = "CounterSet: ";
for (int i = 0; i < data.length(); i++) {
retval += data.bytes.toString();
retval += data.packets.toString();
}
return retval;
}
2.11 main 方法(*)
如果类中包含main(String[]) 方法, 那么它应该写在类的底部。
3 代码编写风格
3.1 语句
3.1.1 简单语句
每一行包含至多一条语句。
3.1.2 复合语句
复合语句是指附加形如"{……}"封套结构的语句。
封套内的语句要比复合语句多缩进一个层次。
开头的括号因该在起始复合语句同一行的末尾;结尾的括号应该新起一行并和起始的复合语句保持同样缩进。
应当对所有诸如if-else,while,for,try-catch结构的控制语句都使用大括号,即使是单个语句,只要它是控制结构的一部分。
【示例】if (condition) {
statements;
} else {
statements;
} //if-else 语句
3.1.3返回语句
有值返回的返回语句不应该使用括号,除非某些情况下为了使得返回值更加明显。
【示例】return;
return myDisk.size();
return (size ? size : defaultSize);
3.2 位置控制
3.2.1 缩进
应当用四个空格作为缩排的单位。不要在源文件中保存Tab 字符(!!)。以免在使用不同的源代码管理工具时Tab 字符将因为用户设置的不同而显示为不同的宽度。
3.2.2 行的长度
避免行长超过80个字符,因为这样不好被大多数终端显示和工具处理。
3.2.3 折叠的行
当表达在一行放不下时,根据下面的一般原则打断它:
在一个逗号后打断。
在运算符前打断。
高层次的打断优于低层次的打断。
让新起的行与上一行同一层次表达的开头对齐。
如果上面的方法导致代码混乱或者代码减少了合适的页边空白,那么使用缩进8个空格代替。
【示例】下面的例子打断了方法调用:
someMethod(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);
var = someMethod1(longExpression1,
someMethod2(longExpression2,longExpression3));
【示例】 下面两个例子打断了算术表达式。第一个较好,因为打断发生在较高层次上。
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6;
【示例】 语句的行折叠通常用8空格,这是因为4空格会使主体部分看起来困难。
//USE THIS INDENTATION INSTEAD
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
3.3 空白处理
3.3.1 空行
空行通过分开局部相关的代码部分,增加了可读性。
在下列情况下总是使用两个空行:
源文件的不同部分之间
和接口定义之间
在下列情况下总是使用一个空行:
在方法之间
方法里面的局部变量声明和它的第一个语句之间
在块注释(参见4.1.1节)或单行注释(参见4.1.2节)之前
方法里面的逻辑部分之间,以提高可读性
3.3.2 空格
应该在下列情况下使用空格:
关键字和后面的括号之间应该使用一个空格。例如:
while (true) {
...
}
注意在方法名和后面的括号之间不应该使用空格。这有助于分清关键字和方法调用。
逗号之后应该使用一个空格。
除了“.”之外的所有二元操作符应该用空格和操作数分开。对于一元操作符不使用空格。
【示例】 a = (a + b) / (c * d);
while (d++ = s++) {
n++;
}
printSize("size is " + foo + "\n");
for语句中的表达式应当用空格分开。
【示例】 for (expr1; expr2; expr3)
强制类型转换应当跟随一个空格。
【示例】 myMethod((byte) aNum, (Object) x);
myMethod((int) (cp + 5), ((int) (i + 3)) + 1); |