【JAVA-1】 1个Package内的Class数在20个以下【推荐】
说明·原因
1个Package中包含的Class数在20个以下,如果超出了此数,那么请重新设计,如分割Package等。
【JAVA-2】 1个Class内的public Method数目在20个以下【推荐】
说明·原因
1个Class内的public Method要在20个以下。当Method数超出此数时,请重新设计,如分割Class等。
例外:JavaBean的properties的getter/setter是除外的。
【JAVA-3】 1个Method的行数在大约150行以下【推荐】
说明·原因
1个Method的行数最多不要超过150行,如果超出了此数,那么请重新设计,如分割成多个Method等。
【JAVA-4】 访问Class的静态Method时,通过Class名来访问【规定】
说明·原因
通过Class名直接访问静态Method,这将使代码一目了然,提高可读性。
例
BadSample object = new BadSample(); object.sampleClassMethod(); //错误 FixedSample.sampleClassMethod(); //正确 |
【JAVA-5】 将重复处理中的Object生成控制到最小限度【推荐】
说明·原因
在重复次数多的循环中生成Object是需要时间的,因此次数多时会导致性能大幅下降。为避免此问题,在循环外生成Instance并重复利用。
例
for (int i = 0; i < array.length; i++) { StringBuffer sampleBuffer = new StringBuffer(); // 错误 System.out.println(sampleBuffer.toString()); } StringBuffer sampleBuffer = new StringBuffer(); // 正确 for (int i = 0; i < array.length; i++) { System.out.println(sampleBuffer.toString()); sampleBuffer.setLength(0); // 返回初始状态 } |
【JAVA-6】 在重复处理内部不使用try Block(有异常)【注意】
说明·原因
在循环中尽可能不要放try/catch Block。这样会导致性能下降,其循环内的处理也变得异常难懂。如无特别理由,请在循环外进行try/catch。但是,即使发生了异常也必须处理剩余的数据时,需要在LOOP中进行try/catch。
例
for(int i = 0; i < size; i++){ // 错误 循环中有try/catch Block try { int num = Integer.parseInt(str[i]); }catch(NumberFormatException e) { e.printStackTrace();// 字符串不是数值时发生 } } try { // 正确 循环外有try/catch Block for(int i = 0; i < size; i++){ int num = Integer.parseInt(str[i]); } } catch(NumberFormatException e) { e.printStackTrace();// 字符串不是数值时发生 } |
【JAVA-7】 Utility Class(工具类)的所有的构造器都应是private【推荐】
说明·原因
Utility Class中只含有static Method和static字段。Utility Class并未被设计成可Instance化。因此,Utility Class的所有的构造器都应是private。
例
public class UCC { public UCC() {} // 错误 public static String getS() { return s; } public static String s = "foo"; } public class UCCFixed { private UCCFixed() {} // 正确 public static String getS() { return s; } public static String s = "foo"; } |
【JAVA-8】 若Method为空,使用声明为abstract【推荐】
说明·原因
不要使未执行任何操作的Method成为空的,如果需要,声明为abstract。这样可防止实现SubClass时有遗漏。
例
public interface ISample { public void sampleMethod(); } public abstract class BadSample implements ISample { public void sampleMethod(){} // 错误 } public abstract class FixedSample implements ISample { public abstract void sampleMethod(); //正确 } |
【JAVA-9】 不写不会被使用的代码【推荐】
说明·原因
请删除不被使用的private Method及变量、或Local变量。如果需要,请修改成可利用的代码,否则会降低代码的可读性,且白白浪费资源。
例
private void usedMethod(){ } private void unusedMethod(){ } //错误 未被使用的Method
private void usedMethod(){ } //正确 |
【JAVA-10】 使Parameter的数相同的Method不会重载【推荐】
说明·原因
此规则的目的是为了避免因多个Method(包含有兼容性的型的Parameter)重载而引起的混乱。比如,看一下Class B继承了Class A的下面的代码。想要调用此代码中的Method,就有可能发生不知道调用哪个Method的问题。
class test {
public void foo (A param) { /* ... */ }
public void foo (B param) { /* ... */ }
// ...
}
但如果使用下面的变量声明,那么在调用foo (x)时,会调用格式A的Method。这是因为x作为B Class的Instance,存在于A变量的内部。
A x = new B ();
请使用更改Method的名字或更改Parameter数等方法,区别每个Method。
例
class OVERLOAD { public void method (ArrayList al) {} // 错误 public void method (Vector v) {} // 错误 } class OVERLOADFixed { public void arrayListMethod (ArrayList al) {} // FIXED 正确 public void vectorMethod (Vector v) {} // FIXED 正确 } |
【JAVA-11】 区别使用Local变量和Instance变量【推荐】
说明·原因
如果定义不必要的Instance变量,将会成为性能及可读性下降的主要原因,且在多线程中会存在同步的问题。使用Instance变量时,请充分考虑其必要性。
例
public class BadSample { // 错误 只在1个Method内使用的变量 private int value; // value 只在此Method中被使用了 public void calcValue(SomeObj inValue){ // 没有必要成为Instance变量 value = inValue.getData(); } } public class FixedSample { public void calcValue(SomeObj inValue){ // 正确 在Method内声明 int value = inValue.getData(); } } |
【JAVA-12】 Superclass(超类)的Instance变量在Subclass内不会重载【规定】
说明·原因
声明相同名字的字段的话,超类的字段会因Subclass中声明的字段而被隐藏。这会引起其他人的混乱,因此请不要命名重复的名字。
例
public class BadSample{ protected int number = 4; } public class ChildBadSample extends BadSample{ protected int number = 5; // 错误 } public class FixedSample{ protected int number = 4; } public class ChildFixedSample extends FixedSample{ protected int childNumber = 5; // 正确 } |