npk*_*llr 5 java variables findbugs subclass superclass
我目前正在处理另一个人项目的一些 Findbugs 问题。
这是我正在处理的问题:
正确性 - 类定义了屏蔽超类字段的字段
该类定义了一个与超类中的可见实例字段同名的字段。这是令人困惑的,如果方法在需要另一个字段时更新或访问其中一个字段,则可能表示错误。
有超类OutputInterface和CoreOutputInterface扩展的子类OutputInterface。他们都定义了变量className。
CoreOutputInterface也有一些子类。
为了解决这个问题,我只需className从子类 ( CoreOutputInterface) 中删除 ,因为它已经在超类中定义了。
变量永远不会用super.classNameor读取或设置this.className,只有用className,所以在我看来它不应该导致任何问题。
此外,整个项目中从未引用超类中的变量(我使用 Eclipse 引用函数检查了它)。
谁能确认这在任何情况下都不会导致问题?
在此先感谢您的帮助。
输出接口:
public abstract class OutputInterface {
protected String className = null;
...
}
Run Code Online (Sandbox Code Playgroud)
核心输出接口:
public abstract class CoreOutputInterface extends OutputInterface {
protected String className = null;
...
public void getClassName() {
return className;
}
public void setClassName(String newName) {
className = newName;
}
...
}
Run Code Online (Sandbox Code Playgroud)
是的,从子类中删除声明。并像上面的示例中那样提供/保留一个 getter,如果需要,还可以提供一个 setter。如果该字段从未使用过,则在创建“CoreOutputInterface”时,它可能只是被忽略了,因为开发人员可能复制粘贴了“OutputInterface”,然后进行了相应的编辑。
更理论上来说,根据类的复杂性和使用情况,这是或可能成为已知的SOLID OOP 设计原则的破坏Liskov 替换原则的示例。它规定超类对象必须始终可以用其子类对应对象替换。鉴于所使用的两个“className”字段之间存在差异,方法可能会错误地依赖其中一个或另一个,并导致未定义的行为,如报告中所述。
然而,我更困惑,为什么“类”被称为Interface。