命名隐藏的审查有以下几种情况:
类成员变量被局部变量隐藏:因类方法体中的局部变量和类成员变量具有相同的名字,而使成员变量被屏蔽。一般情况下,类构造函数或赋值方法的入参和类中的成员变量保持相同的名字,类的成员变量通过 this 显式标识,这种情况下该审查规则不会警示。该审查内容对应于“ Declaration Style ”下的“ Hiding Names ”设置项。
代码清单 7 局部变量隐藏成员变量
public class HideName
{
int index;
void func()
{
int index;// 隐藏了成员变量 index ,应改成另一个名字,如 int newIndex;
// do something
}
void setIndex(int index)
{
this.index = index;// 该语句行中带 this 显式引用成员变量进行赋值,审查规则将不报警
index++;// 该语句行没有 this 显式引用,审查规则将报警
}
}
子类成员变量隐藏父类成员变量:子类成员变量和可继承的父类成员变量名字相同。该审查内容对应于“ Declaration Style ”下的“ Hiding Inherited Field ”设置项。
代码清单 8 子类成员变量隐藏父类成员变量
class Window
{
protected int style;
}
class Button extends Window
{
protected int style;// 具有和父类相同的成员变量,应改为另一个名字,如 anStyle
}
子类覆盖父类静态方法:和非静态的方法覆盖不一样,静态的父类方法不应被子类覆盖,该审查内容对应于“ Declaration Style ”下的“ Hiding Inherited Static Methods ”。
代码清单 9 子类覆盖父类静态方法
class Animal
{
static void oper1(){}
static void oper2(){}
}
class Elephant extends Animal
{
static void oper1() {}// 隐藏了父类中的静态方法,应取另一个名字,如 anOper1()
static void oper2() {}// 隐藏了父类中的静态方法,应取另一个名字,如 anOper2()
}
成员变量和局部变量的隐藏,常常会使开发人员张冠李戴,犯一些不经意的错误,而子类隐藏父类的成员和静态变量常常是由于没有注意到父类中已经具有相同的名字而引起的,由此而生产的程序 Bug 由于其隐身性强,是很难被发现,该审查项帮助你规避这一问题。