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的异常。