我目前正在处理另一个人项目的一些Findbugs问题。
这是我正在研究的问题:
正确性-类定义掩盖超类字段的字段
此类定义与超类中的可见实例字段同名的字段。这令人困惑,并且如果方法在需要一个字段时更新或访问一个字段,则可能会指示错误。
有超类OutputInterface
和子类CoreOutputInterface
扩展了OutputInterface
。它们都定义了变量className
。
CoreOutputInterface
也有一些子类。
要解决此问题,我只需从子类(className
)中删除CoreOutputInterface
,因为它已在超类中定义。
永远不要使用super.className
或this.className
来读取或设置该变量,而只能使用className
来读取或设置该变量,因此我认为它不会导致任何问题。
同样,超类中的变量永远不会在整个项目中被引用(我使用Eclipse引用函数对其进行了检查)。
任何人都可以确认这在任何情况下都不会导致问题吗?
预先感谢您的帮助。
OutputInterface:
public abstract class OutputInterface {
protected String className = null;
...
}
CoreOutputInterface:
public abstract class CoreOutputInterface extends OutputInterface {
protected String className = null;
...
public void getClassName() {
return className;
}
public void setClassName(String newName) {
className = newName;
}
...
}
答案 0 :(得分:2)
是的,从子类中删除声明。并按照示例中的方法在getter和setter上方提供/离开。如果该字段从未使用过,则在创建“ CoreOutputInterface”时可能会被忽略,因为开发人员可能复制粘贴了“ OutputInterface”,然后进行了相应的编辑。
从理论上讲,根据类的复杂性和用法,这已经成为或可能成为已知的 SOLID OOP设计原则中破损的 Liskov替换原理的一个示例。它指出,超类对象必须始终可替换为其子类的对应部分。鉴于报告中使用的两个“ className”字段之间存在差异,因此一种方法可能会错误地依赖一个或另一个,从而导致不确定的行为,如报告中所述。
但是,我更困惑为什么将“类”称为接口。