4.1 规则

规则1 数据库操作、IO操作等需要使用结束close()的对象必须在try -catch-finally 的finally中close(),如果有多个IO对象需要close(),需要分别对每个对象的close()方法进行try-catch,防止一个IO对象关闭失败其他IO对象都未关闭。

示例:

try {
    ...
} catch(IOException ioe) {
    ...
} finally {
    try {
        out.close();
    } catch (IOException ioe) {
        ...
    }

    try {
        in.close();
    } catch (IOException ioe) {
        ...
    }
}

规则2 字符串使用equals操作符时,已知不为空的字符串在前。必要时候需要判断字符串是否为空。

示例:

Private String phoneTypeStr = “wcdma”;
private int getPhoneType(String type) {
    if (phoneTypeStr.equals(type)) {
        return 0;
    }
}

规则3 方法的功能尽量单一。

规则4 多次使用,且内容不变的变量,必须定义为静态常量。

规则5 字符串、数字应应定义成变量或常量,初始化之后再使用。严谨在代码逻辑中使用数字(变量常量定义、for循环除外)。

规则6 系统非正常运行产生的异常捕获后,如果不对该异常进行处理,则应该记录日志。

说明:此规则指通常的系统非正常运行产生的异常,不包括一些基于异常的设计。若有特殊原因必须用注释加以说明。

示例:

try {
    ...
} catch (IOException ioe) {
    logger.error(ioe);
}

规则7 自己抛出的异常必须要填写详细的描述信息。

说明:便于问题定位。

示例:

throw new IOException("Writing data error! Data: " + data.toString());

规则8 运行时异常使用RuntimeException的子类来表示,不用在可能抛出异常的方法声明上加throws子句。非运行期异常是从Exception继承而来的,必须在方法声明上加throws子句。

说明:非运行期异常是由外界运行环境决定异常抛出条件的异常,例如文件操作,可能受权限、磁盘空间大小的影响而失败,这种异常是程序本身无法避免的,需要调用者明确考虑该异常出现时该如何处理方法,因此非运行期异常必须有throws子句标出,不标出或者调用者不捕获该类型异常都会导致编译失败,从而防止程序员本身疏忽。 运行期异常是程序在运行过程中本身考虑不周导致的异常,例如传入错误的参数等。抛出运行期异常的目的是防止异常扩散,导致定位困难。因此在做异常体系设计时要根据错误的性质合理选择自定义异常的继承关系。 还有一种异常是Error 继承而来的,这种异常由虚拟机自己维护,表示发生了致命错误,程序无法继续运行例如内存不足。我们自己的程序不应该捕获这种异常,并且也不应该创建该种类型的异常。

规则9 在程序中使用异常处理还是使用错误返回码处理,根据是否有利于程序结构来确定,并且异常和错误码不应该混合使用,推荐使用异常。

说明: 一个系统或者模块应该统一规划异常类型和返回码的含义。 但是不能用异常来做一般流程处理的方式,不要过多地使用异常,异常的处理效率比条件分支低,而且异常的跳转流程难以预测。 注意:Java 5.0 程序内部的错误码可以使用枚举来表示。

规则10 注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。

说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。

示例:

// 下列语句中的表达式
word = (high << 8) | low;   // (1)
if ((a | b) && (a & c));    // (2)
if ((a | b) < (c & d));     // (3)

// 如果书写为
high << 8 | low;
a | b && a & c;
a | b < c & d;
// (1)(2)虽然不会出错,但语句不易理解;(3)造成了判断条件出错。

规则11 避免使用不易理解的数字,用有意义的标识来替代。涉及物理状态或者含有物理意义的常量,不应直接使用数字,必须用有意义的静态变量或者枚举来代替。使用异常来表示方法执行错误,而不是使用C++的错误返回码方式。

示例:如下的程序可读性差。

if (state == 0)  {
    state = 1;
    ...  // program code
}

应改为如下形式:

private final static int TRUNK_IDLE     = 0;
private final static int TRUNK_BUSY     = 1;
private final static int TRUNK_UNKNOWN  = -1;

if (state == TRUNK_IDLE)  {
    state = TRUNK_BUSY;
    ...  // program code
}
// 注意:Java 5.0 下建议使用枚举来表示。

异常:

public void function() {
    ...  
    throw new RuntimeException(“...”);
}

规则12 数组声明的时候使用 int[] index,而不要使用 int index[]。

说明:使用int index[] 格式使程序的可读性较差,int [] index 表示声明了一个int数组(int [])叫做index

示例:

// 如下程序可读性差:
public int getIndex()[]  {
    ....
}
// 如下程序可读性好:
public int[] getIndex()  {
    ....
}

规则13 不要使用System.out与System.err进行控制台打印,应该使用工具类(如:日志工具)进行统一记录或者打印。

说明:代码发布的时候可以统一关闭控制台打印,代码调试的时候又可以打开控制台打印,方便调试。

规则14 用调测开关来切换软件的DEBUG版和正式版,而不要同时存在正式版本和DEBUG版本的不同源文件,以减少维护的难度。

规则15 可以指定类型时,集合必须指定模板类型。

说明:方便程序阅读,除去强制转换代码

示例:

Map<String,MyObject> map = new HashMap<String,MyObject>();

规则16 一个文件不要定义两个类(并非指内部类)。

说明:方便程序的阅读与代码的维护

规则17 所有的数据类必须覆写toString()、hashCode()、equals()方法,toString()方法返回该类有意义的内容。

说明:方便数据类的比较,父类如果实现了比较合理的toString(),子类可以继承不必再重写。

注:hashCode与equals可以使用代码生成工具自动生成。

示例:

public TopoNode {
    private String nodeName;

    public String toString()  {
        return "NodeName : " + nodeName;
    }
}

规则18 判断语句不要使用”* == true”来判断为真

说明:方便阅读,减少没有必要的计算。

示例:

// 以下错误
if (ok == true)  {
    ...
}

// 以下正确:
if (ok) {
    ...
}

规则19 不要写没有必要的向上强制转型。

说明:没必要写的向上强制转型会浪费性能,增加代码阅读难度。

示例:

// 以下错误:
FileInputStream fis = new FileInputStream(f);
InputStream is = (InputStream)fis;

results matching ""

    No results matching ""