Java编码指南(4)

  4          设计规范 4.1     质量度量规范

[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等。

 

4.2     Class设计规范

[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";
 }

 

4.3     Method设计规范

[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 正确
}

 

4.4     变量设计规范

[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; // 正确

}

最新回复(0)
Google XML地图百度 XML地图Google txt地图百度 txt地图17社