最近看了点《java编程规范》,总结了点个人觉得很必要的规范内容。
一. 排版规范
1.避免长的布尔表达式,应换成多个更容易理解的表达式。
bool isFinished = (elementNo < 0) || (elementNo > maxElement);
bool isRepeatedEntry = elementNo == lastElement;
if (isFinished || isRepeatedEntry) {
…
}
// 避免
if ((elementNo < 0) || (elementNo > maxElement)|| elementNo ==
lastElement) {
…
}
2.不要在条件语句中执行方法,以提高可读性(java里似乎经常这样做)
InputStream stream = File.open(fileName, "w");
if (stream != null) {
…
}
//避免
if (File.open(fileName, "w") != null)) {
…
}
3 代码缩进,应该使用4 个空格为一个单位进行缩进(如果用eclipse的话,直接选定需要缩进内容,按ctrl+shitf+F,注意先切换掉输入法)
public String invoke() throws Exception {
....String profileKey = "invoke: ";
try {
....UtilTimerStack.push(profileKey);
if (executed) {
....test = true;
}
catch{
}
}
4. 条件语句的主要形式,即使单条语句,也要使用括号括起来。(我似乎做到了)
if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else {
statements;
}
5.空循环体也要使用完整的{}块
for (initialization; condition; update) {
;
}
6. try-catch 使用格式(个人觉得第二种挺重要的)
try {
statements;
}
catch (Exception exception) {
statements;
}
try {
statements;
}
catch (Exception exception) {
statements;
}
finally {
statements;
}
7. 空格的使用 (这个值得注意)
1. 运算符两边应该各有一个空格。
2. Java 保留字后面应跟随一个空格。
3. 逗号后面应跟随一个空格。
4. 冒号两个应各有一个空格。
5. 分号后面应跟随一个空格。
a = (b + c) * d; // NOT: a=(b+c)*d
while (true) { // NOT: while(true){ ...
doSomething(a, b, c, d); // NOT: doSomething(a,b,c,d);
case 100 : // NOT: case 100:
for (i = 0; i < 10; i++) { // NOT: for(i=0;i<10;i++){ ...
8. 空行的使用(我的理解是,尽量多用...)
1. 文件头部注释、package 语句和import 语句之间。
2. class 之间
3. 方法之间
4. 方法中,变量的申明和具体代码之间。
5. 逻辑上相关的语句段之间
6. 块注释和行注释的前面
9. 逻辑上紧密相关的代码块应该用一个空行分开。
// Create a new identity matrix
Matrix4x4 matrix = new Matrix4x4();
// Precompute angles for efficiency
double cosAngle = Math.cos(angle);
double sinAngle = Math.sin(angle);
// Specify matrix as a rotation transformation
matrix.setElement(1, 1, cosAngle);
matrix.setElement(1, 2, sinAngle);
matrix.setElement(2, 1, -sinAngle);
matrix.setElement(2, 2, cosAngle);
// Apply rotation
transformation.multiply(matrix);
10 为了保证可读性,变量名应该左对齐。
TextFile file;
int nPoints;
double x, y;
//避免
TextFile file;
int nPoints;
double x, y;
11 当对if 语句中的条件进行折行时,应该使折行的条件语句相对主功能
语句再行缩进4 个空格,以突出主要功能语句。(好像没注意过)
//使用这种缩进,突出主要功能语句。
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
//避免使用这种缩进,主功能语句不突出。
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
12 三元条件运算符
可以使用如下三种表达方式,条件要用括号括起来。
alpha = (aLongBooleanExpression) ? beta : gamma;
alpha = (aLongBooleanExpression) ? beta
: gamma;
alpha = (aLongBooleanExpression)
? beta
: gamma
二. 命名规范
先说两个术语:
Pascal case :所有单词第一个字母大写,其它字母小写。
例:Person, OrderDetail, OilTank。
Camel case :除了第一个单词,所有单词第一个字母大写,其他字
母小写。
例:oilLevel, customerName
1. 包名应该用小写字母,不要出现下划线等符号,名词用有意义的缩写或
者英文单词。
//推荐
com.esse.business
java.lang.util
//避免
com.Esse-tech.buSiness
2 所有类命名使用Pascal(单词首字母都大写)表示方式,使用名词组合。
UserManager, ClassLoader, HttpHeaderResult
3 接口命名使用字母“I”加上Pascal 形式的表示方式。
IQuery, IDataAccess,IReportBuilder
4. 使用名词组合或形容词去命名一个接口,接口声明了一个对象能提供的
服务,也描述了一个对象的能力。一般以“able”和“ible”作为后缀,
代表了一种能力。
public interface Runnable{
public void run();
}
public interface Accessible{
public Context getContext();
}
5 变量名和参数名使用Camel 表示方式。
userName, objectFactory, entrys, list
6 对于常量名,使用大写字母,并使用下划线做间隔。
MAX_TIMES, DEFAULT_NAME
程序中应该使用常量代替“25”,“100”等实际的数字,如:
//推荐
if(times == MAX_TIMES){
…
}
//避免
if(times == 25){
…
}
这样做的好处是,当因需要修改实际的数字时,比如修改25 为30,只需要
修改一处。
7 方法名应该使用动词开头,使用Camel 表示方式,一般由动词+名词组
成。
getName, initialize, addParameter, deleteUser
8 缩写字母也应该保持首字母大写
exportHtmlSource(); // 避免: exportHTMLSource();
openDvdPlayer(); // 避免: openDVDPlayer();
9 变量的名字应该和类型名称一致
void setTopic(Topic topic) // 避免: void setTopic(Topic value)
// 避免: void setTopic(Topic aTopic)
// 避免: void setTopic(Topic t)
void connect(Database database)
// 避免: void connect(Database db)
// 避免: void connect(Database oracleDB)
当同时定义多个属于同一个类的变量时,把类型作为实例的后缀,如:
Point startPoint;
Point centerPoint;
这样做是为了从实例名就可以推断它的类型名称
10 根据变量的作用范围,作用范围大的应该使用长名称,作用范围大,表
明变量的生命周期比较长,为了有助于理解,应尽量用长名称以表达变量的
真实意图。反之,对于作用范围小,可以使用一些简化的名称,比如i,j,
k 等,提高编程效率。
for(int i =0;i < times; i++){
…
}
11 使用get/set 对类属性进行访问,这是Java 社区的核心编码规范。(吾等谨记)
12 使用is 前缀表示一个布尔变量和方法。
isUsed, isEmpty,isVisible,isFinished
有时也可以使用has,can,should:
boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;
13 对于对象集合, 变量名称应使用复数。
Collection<Point> points;
int[] values;
14 对于抽象类,应该使用Abstract 前缀。 (貌似很多代码不是这样的么....)
AbstractReportBuilder,AbstractBeanFactory
15 对于表示编号的变量,应加No 后缀。(好像我都用的idx..)
tableNo, userNo,employeeNo
16 避免使用否定布尔变量(不然要想半天是什么意思了...)
bool isError; // 避免: isNoError
bool isFound; // 避免: isNotFound
17 对于单例类(Singleton),应该使用getInstance 方法得到单例。
class UnitManager {
private final static UnitManager instance = new UnitManager();
private UnitManager() {
...
}
public static UnitManager getInstance(){
return instance_;
}
}
18 对于工厂类,进行创建对象的方法,应该使用new 前缀
class PointFactory {
public Point newPoint(...) {
...
}
}
三. 注释规范
1. 使用行末注释对深层嵌套代码进行注释
for(i…){
for(j…){
while(…){
if(…){
switch(…){
…
}// end switch
}//end if
}//end while
}//end for i
}//end for j