| | | | | | | [文章信息] | | | 作者: | 陈雄华 | | 时间: | 2005-01-04 | | 出处: | 天极网 | | 责任编辑: | 方舟 | |
| [文章导读] | | | 代码审查作为JBuilder 2005强大的新特性闪亮登场,直指编码中的软肋 | |
| |
|
| | | |
|
|
|
|
|
声明审查
1、避免命名覆盖
命名隐藏的审查有以下几种情况:
1) 类成员变量被局部变量隐藏:因类方法体中的局部变量和类成员变量具有相同的名字,而使成员变量被屏蔽。一般情况下,类构造函数或赋值方法的入参和类中的成员变量保持相同的名字,类的成员变量通过this显式标识,这种情况下该审查规则不会警示。该审查内容对应于"Declaration Style"下的"Hiding Names"设置项。
代码清单 7 局部变量隐藏成员变量
1. public class HideName 2. { 3. int index; 4. void func() 5. { 6. int index;//隐藏了成员变量index,应改成另一个名字,如int newIndex; 7. // do something 8. } 9. void setIndex(int index) 10. { 11. this.index = index; //该语句行中带this显式引用成员变量进行赋值,审查规则将不报警 12. index++;//该语句行没有this显式引用,审查规则将报警 13. } 14. } | 2) 子类成员变量隐藏父类成员变量:子类成员变量和可继承的父类成员变量名字相同。该审查内容对应于"Declaration Style"下的"Hiding Inherited Field"设置项。
代码清单 8 子类成员变量隐藏父类成员变量
1. class Window 2. { 3. protected int style; 4. } 5. 6. class Button extends Window 7. { 8. protected int style;//具有和父类相同的成员变量,应改为另一个名字,如anStyle 9. } |
3) 子类覆盖父类静态方法:和非静态的方法覆盖不一样,静态的父类方法不应被子类覆盖,该审查内容对应于"Declaration Style"下的"Hiding Inherited Static Methods"。
代码清单 9子类覆盖父类静态方法
1. class Animal 2. { 3. static void oper1(){} 4. static void oper2(){} 5. } 6. 7. class Elephant extends Animal 8. { 9. static void oper1() {}//隐藏了父类中的静态方法,应取另一个名字,如anOper1() 10. static void oper2() {}//隐藏了父类中的静态方法,应取另一个名字,如anOper2() 11. } | 成员变量和局部变量的隐藏,常常会使开发人员张冠李戴,犯一些不经意的错误,而子类隐藏父类的成员和静态变量常常是由于没有注意到父类中已经具有相同的名字而引起的,由此而生产的程序Bug由于其隐身性强,是很难被发现,该审查项帮助你规避这一问题。
2、使用适合的修饰符
static,final,可视域等修饰符可以用于修饰,类的成员变量、方法及内部类,使用恰当的修饰符,类的封装性、承继性将得到增强,同时还防止了错误的调用。修饰符的审查主要包括以下3点:
1) 常量应该被标识为final:这样可以阻止程序对其值进行更改,也可以防止子类的覆盖。该审查内容对应"Declaration Style"下的"Constant Variables Should Be Final"设置项。
2) 不被外部调用的成员应该声明为private:该审查项主查为了强化类的封装性和内聚性,使类对应的接口更加清晰。该审查项并不对public的成员生效,被标识为public的成员将被看成是希望向外开放的。该审查内容对应"Declaration Style"下的"Member Can be made Private"设置项。在接到该审查项的报警时,开发人员需要根据实际情况作出判断,以将确实可以设置为private的成员改正过来。
3) 可设置为static的成员:JBuilde r2005分析哪些成员变量及成员内部类可以置为static:即那些在静态环境下使用的成员变量和没有引用容器类非静态成员和方法的内部类。该审查内容对应"Declaration Style"下的"Member Can be made Static"设置项。
3、有关子类覆盖的审查
JBuilder将对继承覆盖中的以下几个方面进行审查:
1) equals()和hashcode()方法必须同时覆盖:类覆盖了Object类中所定义的equals(Object obj),同时也必须覆盖Object类中所定义的hashCode()方法,因为必须保证用equals(Object obj)判断为相同的对象拥有相同的hashCode值。该审查内容对应"Declaration Style"下的"Override Hash code when you override Equals"设置项。
2) 将父类中的非抽象类覆盖成抽象类:没有理由将父类的非抽象类覆盖成子类的抽象类,甚至可以断定这是编码上的偏误。该审查内容对应"Declaration Style"下的"Overriding a Non-Abstract Method with an Abstract Method"设置项。
3) 在子类中声明和父类相同的private方法:private方法是不能被覆盖的,一般情况下,可以被子类覆盖的方法是protected或public。该审查内容对应"Declaration Style"下的"Overriding a Private Method"设置项。
4、代码排列及先后顺序
对类文件的代码进行良好的组织,可以增强代码的可维护性和可读性,JBuilder 2005对代码的排列及先后顺序进行以下方面的审查:
1) 类成员的排列:根据Sun的代码编程惯例,成员的先后顺序以可视域从大到小排列,即: public->protected->默认->private。类中的成员按如下方式排列:
2)静态成员变量排在最前面,静态成员间以可视域从大到小排列。
3)第二位是实例成员变量,实例成员变量间以可视域从大到小排列。
4)第三位是构造函数。
5)第四位是成员方法
该审查内容对应"Declaration Style"下的"Order of Declaration of Class Members"设置项。
i 将重载方法列在一起:类的重载方法完成相似的功能,具有相同的方法名,将它们列在一起可以增强程序的可读性,且不容易遗漏掉某个功能。该审查内容对应"Declaration Style"下的"Place Methods with Same Name Together"设置项。
ii 将public类放在前面:对于包含多个类的程序文件,应该把public的类放在前面。该审查内容对应"Declaration Style"下的"Place Public Class First"设置项。
|
|
|
|
|
|
|
|