Java编码指南(7)

 

5.5     数值规范

【JAVA-24】   进行无误差或大数计算时,使用BigDecimal Class【推荐】

说明·原因

浮点数运算是用于科学技术计算的,会发生误差。与此相比,Class“BigDecimal”,是用字符串计算数值的,适合用于金额等的正确的计算。使用BigDecimal,可以保证生成Instance时指定的位数上的精度。

 

【JAVA-25】   不转成低精度的原语型【注意】

说明·原因

表示数值的原语型的变量中,定义了数值的精度。如果将高精度的变量转换成低精度的型,其值就会变更为转型后的精度。因此,计算中可能会出现误差。

double doubleType = 2.75;

int intType = (int)doubleType; // 将double转成int型 //错误

 

5.6     集合规范

【JAVA-26】   使用Java2之后的集合类【推荐】

说明·原因

是否使用了Vector Class、Hashtable Class、Enumeration Class?如果没有使用这些的特别理由,那么为了统一Interface,请使用List(ArrayList Class)、Map(HashMap Class)、Iterator来代替这些。通过使用List等的Interface,可以利用JDK1.2中整理的易懂的Method。另外,因Interface的特性,变更实现Class时可以不变更调用方。

Vector sampleVector = new Vector(); //错误

List sampleList = new ArrayList(); //正确

 

【JAVA-27】   利用只接受特定型的Object的集合类【推荐】

说明·原因

在集合中只保存某个特定型的Object时,针对只处理特定型Object的集合类,有新定义的方法。比如,自己定义只保存String的集合。

定义这样的集合类的好处如下:

l  不会错误保存不同型的Object,因此不会发生ClassCastException;

l  从集合取出Object时,不用一个一个地转型(也不需要instanceof的Check Logic)。

基于上述原因,可减少发生BUG的可能性,代码也变得简单,进而可提高代码的可读性。

下面的Class是只处理String Object的HashMap的例子:

public class StringHashMap {

    private HashMap map = new HashMap();

    public void put( String key, String value ){

        map.put( key, value );

    }

    public String get( String key ){

        return (String)map.get(key);

    }

}

 

5.7     Stream规范

【JAVA-28】   利用处理Stream的API时,在finally Block中进行后处理【注意】

说明·原因

为避免内存泄漏,Stream的Close是必须的。即使中途发生了异常,也必须Close,因此请在finally Block中描述close() Method。

try {

    BufferedReader reader = new BufferedReader(new FileReader(file));

    reader.read();

    reader.close(); // 错误

} catch (FileNotFoundException fnfe) {

    fnfe.printStackTrace();

} catch (IOException ioe) {

    ioe.printStackTrace();

}

BufferedReader reader = null;

try {

    reader = new BufferedReader(new FileReader(file));

    reader.read();

} catch (FileNotFoundException fnfe) {

    fnfe.printStackTrace();

} catch (IOException ioe1) {

    ioe1.printStackTrace();

} finally {

    try{

        reader.close(); // 正确

    }catch(IOException ioe2){

        ioe2.printStackTrace();

    }

}

 

【JAVA-29】    ObjectOutputStream中利用reset()【推荐】

说明·原因

在使用ObjectOutputStream Object的Method中,请适当调用reset()。关于ObjectOutputStream Class,从其功能上来看,它会始终保持对写入的所有的Object的应用,直至调用reset()为止。在调用reset() Method之前,这些Object不会被GC回收。不调用reset() Method,而通过ObjectOutputStream Object写出了很多个Object时,可能会发生OutOfMemoryError。

public class BadSample {

public void writeToStream(Object input)throws IOException {

ObjectOutputStream stream = new ObjectOutputStream(

new FileOutputStream("output"));

stream.writeObject(input); // 错误

  }

}

 

public class FixedSample {

public void writeToStream(Object input)throws IOException {

ObjectOutputStream stream = new ObjectOutputStream(

new FileOutputStream("output"));

stream.writeObject(input);

stream.reset();// 正确

  }

}

 

5.8     异常规范

【JAVA-30】   生成Exception Class的Object后不抛出【注意】

说明·原因

Exception Class是所有的异常的超类。将Exception Class的Instance作为异常来接受的代码中,对其异常的种类及处理,将不能利用Polymorphism(多态性)。请务必抛出合适的Subclass的Object。

public void badSampleMethod() throws Exception { // 错误

throw new Exception(); // 错误

}

public void fixedSampleMethod () throws NoSuchMethodException { // 正确

throw new NoSuchMethodException ();// 正确

}

 

【JAVA-31】   catch Block中必须进行处理【推荐】

说明·原因

不要使catch Block为空,一定要对异常进行处理。正是为了处理异常才Catch的。什么也不做的话会发生新的BUG。即使处理不了,也要进行能确认发生了异常的动作,如输出到LOG。

try{

reader.close();

}catch(IOException ioe2){ //错误

}

try{

reader.close();

}catch(IOException ioe2){

ioe2.printStackTrace(); //正确

}

 

【JAVA-32】   不继承ErrorThrowable Class【注意】

说明·原因

请不要定义Error Class的Subclass。Error Class表示在Application中不应Catch的重大的问题。因此,在Application中不能定义Error Class的Subclass。在Application定义的异常继承Exception Class。另外,不能定义Throwable的Subclass。Throwable Class是Exception和Error的超类。如果此Class继承Application的异常,那么Error和异常的意义就会变得模糊。Error Class,如上所述是不应该在Application继承的。同样,Application不应该继承Thorwable Class。Application中定义的异常继承Exception Class。

public class BadSampleException extends Error { // 错误

}

public class AnotherBadSampleException extends Throwable { // 错误

}

public class FixedSampleException extends Exception { // 正确

}

 

你可能感兴趣的:(Java)