【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; // 正确 } |
【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这样的类) |
【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”)); //正确 |