JAVA代码规范
定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)主要分四个部分,1、命名规范,对于临时变量,可以采用短变量名提高效率,对于成员变量,尽量从变量名上体现其含义。2、文件样式规范,主要关注正确的注释填写。3、代码编写格式,这个可以通过一些工具来实现。比如jalopy。4。程序编写规范, 出于减容以及提速的考虑,具体编程中的一些小技巧和注意点,需要注意的是,往往忠孝不能两全,规则本身会有冲突的地方,熊掌和鱼,根据系统需求决定取舍。命名规范一般不要用package,浪费。Class 的命名
Class 的名字必须由大写字母开头而其它字母都小写的单词组成 Class 变量的命名
变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。 Static Final 变量的命名
Static Final 变量的名字应该都大写,并且指出完整含义。 参数的命名
参数的名字必须和变量的命名规范一致。 数组的命名
数组应该总是用下面的方式来命名:
byte[] buffer;
而不是:
byte buffer[];
方法的参数
使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
Java 文件样式
所有的 Java(*.java) 文件都必须遵守如下的样式规则
版权信息
版权信息必须在 java 文件的开头,比如: /** * Copyright ® 2000 XXX Co. Ltd. * All right reserved. */
其它不需要出现在 javadoc 的信息也可以包含在这?。 Package/Imports
package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。
1
2
3 package hotlava.net.stats;
import java.io.*;
import java.util.Observable;import hotlava.util.Application;
这儿java.io.* 使用来代替InputStream and OutputStream 的。
Class
接下来的是类的注释,一般是用来解释类的。
1 /** * A class representing a set of packet and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */
接下来是类定义,包含了在不同的行的 extends 和 implements
1 public class CounterSet extends Observable implements Cloneable
Class Fields 接下来是类的成员变量:
1
2
3
/** * Packet counters */
protected int[] packets;public 的成员变量必须生成文文件(JavaDoc)。proceted、private和 package 定义的成员变量如果名字含义明确的话,可以没有注释。 存取方法
接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。
1
2
其它的方法不要写在一行上 构造函数
接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。
访问类型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。
类方法
下面开始写类的方法: 代码编写格式下列规范可以省去,可以用eclipse插件来达到目的。
代码样式
代码应该用 unix 的格式,而不是 windows 的(比如:回车变成回车+换行) 文檔化
必须用 javadoc 来为类生成文档。不仅因为它是标准,这也是被各种 java 编译器都认可的方法。
缩进
缩进应该是每行4个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度.
如果你使用 UltrEdit 作为你的 Java 源代码编辑器的话,你可以通过如下操作来禁止保存Tab字符, 方法是通过 UltrEdit中先设定 Tab 使用的长度室4个空格,然后用 Format|Tabs to Spaces 菜单将 Tab 转换为空格。 页宽
页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符. {} 对
{} 中的语句应该单独作为一行. 例如, 下面的第1行是错误的, 第2行是正确的:
1
2 if (i>0) { i ++ };
// 错误, { 和 } 在同一行1
2
3
4 if (i>0) {
i ++
};
// 正确, { 单独作为一行 } 语句永远单独作为一行. 如果 } 语句应该缩进到与其相对应的 { 那一行相对齐的位置。 括号
左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不应该出现空格. 下面的例子说明括号和空格的错误及正确使用:
1
2 CallProc( AParameter ); // 错误
CallProc(AParameter); // 正确 不要在语句中使用无意义的括号. 括号只应该为达到某种目的而出现在源代码中。下面的例子说明错误和正确的用法:
1
2 if ((I) = 42) { // 错误 - 括号毫无意义
if (I == 42) or (J == 42) then // 正确 - 的确需要括号 程序编写规范
1. new 关键字,如果要用,尽量在loading阶段,此时系统内存较多空闲的时候。不要用new string(“aaaa”);
2. 对流对象的使用,一定要保证在任何情况下都能关闭,如,在finally{}中关闭。
3. 调用getClass()方法时,尽可能利用现存的static的对象实例,而不是新建一个对象实例再调用。
4. 用System.arraycopy ()拷贝数组,而不是用for循环拷贝。
5. 对于非常量的字符串,用stringbuffer而不是string
6. 对常量字符串,用string而不是stringbuffer。
7. 对于简单if else的优化,如:
if( a==b)
{
return true;
}
else
{
return false;
}
直接 return (a==b);
8. 尽量不要在for循环()内调用方法。同样,将vector.size()变为 array.length,同样的处理方法。
EXAMPLE 9. 要在循环{}内声明新的变量名:
EXAMPLE
10. Final的成员变量最好加上static。
package examples.rules.opt;public class NSF {
final int magicNumber= 0; //VIOLATION
}REPAIR package examples.rule.opt;public class NSFFixed {
static final in magicNumber= 0; //FIXED
}11.对于字符串中单个字符的比较,用 'charAt()' 而不是 'startsWith()'
package examples.rules.opt;public class PCTS {
private void method(String s) {
if (s.startsWith("a")) // VIOLATION
System.out.println("starts with a.");
}
}REPAIR Replace 'startsWith()' with a test for non-zero length and 'charAt(0)'.package examples.rules.opt;public class PCTSFixed {
private void method(String s) {
if (s.length () > 0 && s.charAt(0) == 'a') // FIXED
System.out.println("starts with a.");
}
}12. stringbuffer最好指定初始容量。
package examples.rules.opt;public class SB {
void method () {
StringBuffer buffer = new StringBuffer(); // VIOLATION
buffer.append ("hello");
}
}REPAIR Provide an initial capacity for the 'StringBuffer'.package examples.rules.opt;public class SBFixed {
void method () {
StringBuffer buffer = new StringBuffer(SBSIZE); // FIXED
buffer.append ("hello");
}
private static final int SBSIZE = 100;
}13. 对于字符串相加,其中的单个字符用’’而不用””14. "try/catch/finally" 块要放在循环体外面
15.尽量用栈变量而不是实例变量和类变量,可以提高速度。16.用移位代替2的幂次方的乘除
17.不要用引入匿名类代替接口的实现REPAIR The example code can be rewritten without the inner class as:package examples.rules.j2me;public class ACIIFixed extends Frame
implements ActionListener { // FIXED
private TextField text; /**
* Creates a new example object.
*/
public ACIIFixed() {
add(text = new TextField(), "Center");
pack();
setVisible(true);
text.addActionListener(this); // FIXED
} public void actionPerformed(ActionEvent event) {
text.setText("");
}
}
18.不要直接声明并初始化大的数组。
EXAMPLE For example, the expression int[] prime = {2, 3, 5, 7, 11}; produces
the following bytecode sequence:
The initialization uses 4 instructions per value, but, depending on
the particular values, usually more than 4 bytes per value.
19.不要返回对象实例,而要返回一个索引。
EXAMPLE package examples.rules.j2me;import java.awt.Dimension;public class EURP {
public static Dimension getSizeOfRectangle(int x1, int y1, int x2, int y2) {
return new Dimension(Math.abs(x1-x2), Math.abs(y1-y2)); // VIOLATION
}
}
20.对大数组的初始化,最好检查OutOfMemoryError的异常。
定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)主要分四个部分,1、命名规范,对于临时变量,可以采用短变量名提高效率,对于成员变量,尽量从变量名上体现其含义。2、文件样式规范,主要关注正确的注释填写。3、代码编写格式,这个可以通过一些工具来实现。比如jalopy。4。程序编写规范, 出于减容以及提速的考虑,具体编程中的一些小技巧和注意点,需要注意的是,往往忠孝不能两全,规则本身会有冲突的地方,熊掌和鱼,根据系统需求决定取舍。命名规范一般不要用package,浪费。Class 的命名
Class 的名字必须由大写字母开头而其它字母都小写的单词组成 Class 变量的命名
变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。 Static Final 变量的命名
Static Final 变量的名字应该都大写,并且指出完整含义。 参数的命名
参数的名字必须和变量的命名规范一致。 数组的命名
数组应该总是用下面的方式来命名:
byte[] buffer;
而不是:
byte buffer[];
方法的参数
使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:
Java 文件样式
所有的 Java(*.java) 文件都必须遵守如下的样式规则
版权信息
版权信息必须在 java 文件的开头,比如: /** * Copyright ® 2000 XXX Co. Ltd. * All right reserved. */
其它不需要出现在 javadoc 的信息也可以包含在这?。 Package/Imports
package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。
1
2
3 package hotlava.net.stats;
import java.io.*;
import java.util.Observable;import hotlava.util.Application;
这儿java.io.* 使用来代替InputStream and OutputStream 的。
Class
接下来的是类的注释,一般是用来解释类的。
1 /** * A class representing a set of packet and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */
接下来是类定义,包含了在不同的行的 extends 和 implements
1 public class CounterSet extends Observable implements Cloneable
Class Fields 接下来是类的成员变量:
1
2
3
/** * Packet counters */
protected int[] packets;public 的成员变量必须生成文文件(JavaDoc)。proceted、private和 package 定义的成员变量如果名字含义明确的话,可以没有注释。 存取方法
接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的写在一行上。
1
2
其它的方法不要写在一行上 构造函数
接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。
访问类型 ("public", "private" 等.) 和 任何 "static", "final" 或 "synchronized" 应该在一行中,并且方法和参数另写一行,这样可以使方法和参数更易读。
类方法
下面开始写类的方法: 代码编写格式下列规范可以省去,可以用eclipse插件来达到目的。
代码样式
代码应该用 unix 的格式,而不是 windows 的(比如:回车变成回车+换行) 文檔化
必须用 javadoc 来为类生成文档。不仅因为它是标准,这也是被各种 java 编译器都认可的方法。
缩进
缩进应该是每行4个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度.
如果你使用 UltrEdit 作为你的 Java 源代码编辑器的话,你可以通过如下操作来禁止保存Tab字符, 方法是通过 UltrEdit中先设定 Tab 使用的长度室4个空格,然后用 Format|Tabs to Spaces 菜单将 Tab 转换为空格。 页宽
页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符. {} 对
{} 中的语句应该单独作为一行. 例如, 下面的第1行是错误的, 第2行是正确的:
1
2 if (i>0) { i ++ };
// 错误, { 和 } 在同一行1
2
3
4 if (i>0) {
i ++
};
// 正确, { 单独作为一行 } 语句永远单独作为一行. 如果 } 语句应该缩进到与其相对应的 { 那一行相对齐的位置。 括号
左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不应该出现空格. 下面的例子说明括号和空格的错误及正确使用:
1
2 CallProc( AParameter ); // 错误
CallProc(AParameter); // 正确 不要在语句中使用无意义的括号. 括号只应该为达到某种目的而出现在源代码中。下面的例子说明错误和正确的用法:
1
2 if ((I) = 42) { // 错误 - 括号毫无意义
if (I == 42) or (J == 42) then // 正确 - 的确需要括号 程序编写规范
1. new 关键字,如果要用,尽量在loading阶段,此时系统内存较多空闲的时候。不要用new string(“aaaa”);
2. 对流对象的使用,一定要保证在任何情况下都能关闭,如,在finally{}中关闭。
3. 调用getClass()方法时,尽可能利用现存的static的对象实例,而不是新建一个对象实例再调用。
4. 用System.arraycopy ()拷贝数组,而不是用for循环拷贝。
5. 对于非常量的字符串,用stringbuffer而不是string
6. 对常量字符串,用string而不是stringbuffer。
7. 对于简单if else的优化,如:
if( a==b)
{
return true;
}
else
{
return false;
}
直接 return (a==b);
8. 尽量不要在for循环()内调用方法。同样,将vector.size()变为 array.length,同样的处理方法。
EXAMPLE 9. 要在循环{}内声明新的变量名:
EXAMPLE
10. Final的成员变量最好加上static。
package examples.rules.opt;public class NSF {
final int magicNumber= 0; //VIOLATION
}REPAIR package examples.rule.opt;public class NSFFixed {
static final in magicNumber= 0; //FIXED
}11.对于字符串中单个字符的比较,用 'charAt()' 而不是 'startsWith()'
package examples.rules.opt;public class PCTS {
private void method(String s) {
if (s.startsWith("a")) // VIOLATION
System.out.println("starts with a.");
}
}REPAIR Replace 'startsWith()' with a test for non-zero length and 'charAt(0)'.package examples.rules.opt;public class PCTSFixed {
private void method(String s) {
if (s.length () > 0 && s.charAt(0) == 'a') // FIXED
System.out.println("starts with a.");
}
}12. stringbuffer最好指定初始容量。
package examples.rules.opt;public class SB {
void method () {
StringBuffer buffer = new StringBuffer(); // VIOLATION
buffer.append ("hello");
}
}REPAIR Provide an initial capacity for the 'StringBuffer'.package examples.rules.opt;public class SBFixed {
void method () {
StringBuffer buffer = new StringBuffer(SBSIZE); // FIXED
buffer.append ("hello");
}
private static final int SBSIZE = 100;
}13. 对于字符串相加,其中的单个字符用’’而不用””14. "try/catch/finally" 块要放在循环体外面
15.尽量用栈变量而不是实例变量和类变量,可以提高速度。16.用移位代替2的幂次方的乘除
17.不要用引入匿名类代替接口的实现REPAIR The example code can be rewritten without the inner class as:package examples.rules.j2me;public class ACIIFixed extends Frame
implements ActionListener { // FIXED
private TextField text; /**
* Creates a new example object.
*/
public ACIIFixed() {
add(text = new TextField(), "Center");
pack();
setVisible(true);
text.addActionListener(this); // FIXED
} public void actionPerformed(ActionEvent event) {
text.setText("");
}
}
18.不要直接声明并初始化大的数组。
EXAMPLE For example, the expression int[] prime = {2, 3, 5, 7, 11}; produces
the following bytecode sequence:
The initialization uses 4 instructions per value, but, depending on
the particular values, usually more than 4 bytes per value.
19.不要返回对象实例,而要返回一个索引。
EXAMPLE package examples.rules.j2me;import java.awt.Dimension;public class EURP {
public static Dimension getSizeOfRectangle(int x1, int y1, int x2, int y2) {
return new Dimension(Math.abs(x1-x2), Math.abs(y1-y2)); // VIOLATION
}
}
20.对大数组的初始化,最好检查OutOfMemoryError的异常。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货