Java编码指南(6)

 

5.2     修饰符规范

【JAVA-8】       使用恰当的权限来声明【推荐】

说明·原因

充分理解private、public等访问修饰符的意义,并用恰当的权限来声明Class、Method、变量、变量、常量等。

 

【JAVA-9】       对于不想继承的Class,声明final【推荐】

说明·原因

对于不想继承的Class,请声明final。有如下的好处:

l  Class的继承及无Method的重载等,会通知给编译器,因此能够更加恰当地进行代码的最佳化;

l  通过声明final,可明确不会继承该Class,且会提高可读性。

 

【JAVA-10】    未声明为public的Class中不生成public权限的构造器【推荐】

说明·原因

在不是public的Class中生成构造器时,是否不小心就声明成了public?并不是从哪儿都可以访问不是public的Class的构造器的。比如,下述错误例子中,从别的Package调用此构造器的Class,是通不过编译的。为防止此现象,请重新设计,如从构造器中删除public修饰符,或在Class中加上public修饰符。

class BadSample { //非public的Class

public BadSample(){ //错误

    }

}

class FixedSample {

FixedSample(){ //正确

    }

}

 

【JAVA-11】   对于不想Override(重写)的Method,使用final【推荐】

说明·原因

如果已知不能Override(重写)的话,请声明final。这样编译器会知道谁也不能Override(重写)Method,所以编译器能生成最佳化代码,性能也会提高。

 

【JAVA-12】    Instance变量应设为private【推荐】

说明·原因

考虑面向对象的封装化,不希望谁都可以访问到Class内部状态。因此可定义恰当的get/set Method,只能通过此Method才能访问Instance变量。

public class BadSample {

public int value = 10; //错误

}

public class FixedSample {

private int value = 10; //正确

public int getValue() {

return value;

    }

}

 

【JAVA-13】   不使用Instance字段的Method,声明成static【注意】

说明·原因

Method不使用Instance字段时,需要使用static关键字来声明这些Method。因此,对于不使用Instance Data的Method,需要声明成static。

public class ASI {

    public int add (int i, int j) {  // 错误

        return i + j;

    }

}

public class ASIFixed {

    public static int method (int i, int j) {  // 正确

        return i + j;

    }

}

 

【JAVA-14】   无需特意描述Interface的Method和字段的修饰符【推荐】

说明·原因

interface Method通常会是public及abstract。Interface字段通常会是public、static、及final。修饰符会被自动适用的。因此,不需要特意描述修饰符。

interface AAI {
     public void method ();    // 不需要Method声明的public
     abstract int getSize (); // 不需要Method声明的abstract
     static int SIZE = 100;   // 不需要字段声明的static
 }
interface AAIFixed {
     void method ();  // 正确
     int getSize ();  // 正确
     int SIZE = 100;  // 正确
 }

 

5.3     Import规范

【JAVA-15】   不导入java.lang Package【规定】

说明·原因

你是否知道java.lang Package是不需要明确导入的,开发人员不需要明确导入这个Package。

import java.lang.*; //错误

 

【JAVA-16】   通常程序内部用到的package都是用import语句声明在程序头部;原则上,程序内部不再出现没有import声明的类【推荐】

java.io.File file = new java.io.File(“test.txt”); //错误

File file = new File(“test.txt”); //正确

 

但是会混淆的声明应该在程序中特别指出是那一个package中的。

import java.util.Date;

import java.sql.Date;

java.util.Date date = new java.util.Date();

 

【JAVA-17】   程序中用到的类应该在Import中声明,但是程序中没有用到的类不要出现在Import中【推荐】

import java.util.HashMap;   -> 删除

(程序中未使用HashMap这样的类)

 

5.4     字符串规范

【JAVA-18】   为保持字符串字面值而生成String Object时,不使用new【推荐】

说明·原因

将字符串常量拷贝到String Object,是浪费时间的冗长的工作。请在static final字段中描述字符串常量,而不是生成new Object。

private String _s = new String ("ACDO");  // 错误

private String _s = "ACDO";  // 正确

 

【JAVA-19】   比较字符串是否是相同值时,使用equals() Method【推荐】

说明·原因

使用“==”及“!= ”运算符运算符,并不是比较String是否是相同的字符串,而是检查是否是相同的Instance,这有可能成为出错的原因。因此,比较是否是相同的字符串时,请使用String Class的equals() Method。Literal时,如果内容相同,编译器会进行最佳化使其成为相同的Instance,因此即使使用“==”,String Class的equals() Method的结果也是相同的,但请在编码时遵守此规则。

public boolean compare(String name, String anotherName){

     return name == anotherName; //错误

}

public boolean compare(String name, String anotherName){

     return name.equals(anotherName); //正确

}

 

【JAVA-20】   要更新的字符串中使用StringBuffer Class【推荐】

说明·原因

String的Object是固定字符串,连接起来的话,每次都要重生成Object,因此性能会下降。要变更的字符串就用StringBuffer定义,连接字符串时,请使用StringBuffer Class的append() Method。

String fruit = “apples”;

fruit += “, bananas”; //错误

StringBuffer fruit = new StringBuffer(15);

fruit.append(“apples”); //正确

fruit.append(“, bananas”); //正确

 

【JAVA-21】   Primitive(原语)型和String Object的转换中,使用包装类的Method【规定】

说明·原因

String型和原语型的转换,有很多种方法,但使用已有的转换用的Method,是最易懂的,且处理也是最高效的。

//错误

int -> String 的转换

String sample = “” + integer;

String sample = (new Integer(integer)).toString();

String -> int 的转换

int integer = (new Integer(sample)).intValue();

int integer = Integer.valueOf(sample).intValue();

//正确

int -> String 的转换

String sample = String.valueOf(integer);

String -> int 的转换

int integer = Integer.parseInt(sample);

 

【JAVA-22】   查询字符串中是否含有某字符时,使用charAt() Method【推荐】

说明·原因

查询字符串中是否含有某字符时,参数为1字符时,请使用String Class的charAt() Method。startsWith()是将多个字符串作为参数对象Method。使用参数为1字符的startsWith() Method也能运行,但这是String API的错误使用方法。

注意:将startsWith()替换为chartAt(0)时,首先请确认字符串的长度至少是1字符。

public boolean checkHead(String checkString) {

    return (checkString.startsWith(“E”); //错误

}

public boolean checkHead(String checkString) {

    return (checkString.length() > 0 && checkString.charAt(0) == ‘E’); //正确

}

 

【JAVA-23】   不使用系统依赖符号(\n、\r等)【推荐】

说明·原因

不同的OS其作为换行代码的字符及字符串也不同。因此,将“\n”及“\r”等作为换行代码在代码中直接使用,将降低通用性(失去Java的“Write Once,Run Anywhere”的通用性的特征)。想在代码中使用换行代码时,请使用System.getProperty(),以取得并利用适合于系统的换行代码。

StringBuffer result = new StringBuffer(“Message:\n”); //错误

StringBuffer result = new StringBuffer(“Message:”);

result.append(System.getProperty(“line.separator”)); //正确

 

你可能感兴趣的:(Java)