java - 子类和超类中同名的变量
问题描述
我目前正在处理另一个人项目的一些 Findbugs 问题。
这是我正在处理的问题:
正确性 - 类定义了屏蔽超类字段的字段
该类定义了一个与超类中的可见实例字段同名的字段。这是令人困惑的,并且如果方法更新或在需要另一个字段时访问其中一个字段,则可能表示错误。
有超类OutputInterface
和CoreOutputInterface
扩展的子类OutputInterface
。他们都定义了变量className
。
CoreOutputInterface
也有一些子类。
要解决此问题,我只需className
从子类 ( CoreOutputInterface
) 中删除 ,因为它已在超类中定义。
该变量永远不会用super.className
or读取或设置this.className
,只有 用className
,所以在我看来它不应该导致任何问题。
此外,整个项目中从未引用超类中的变量(我使用 Eclipse 引用函数对其进行了检查)。
谁能确认这在任何情况下都不会导致问题?
在此先感谢您的帮助。
输出接口:
public abstract class OutputInterface {
protected String className = null;
...
}
核心输出接口:
public abstract class CoreOutputInterface extends OutputInterface {
protected String className = null;
...
public void getClassName() {
return className;
}
public void setClassName(String newName) {
className = newName;
}
...
}
解决方案
是的,从子类中删除声明。并提供/离开,因为它们在上面的示例中是一个 getter,如果需要,一个 setter。如果该字段从未使用过,则可能只是在创建“CoreOutputInterface”时被忽略了,因为开发人员可能已经复制粘贴了“OutputInterface”,然后对其进行了相应的编辑。
从理论上讲,根据类的复杂性和使用情况,这是或可能成为已知SOLID OOP 设计原则的破坏Liskov 替换原则的示例。它指出,超类对象必须始终可以用它们的子类对应部分替换。如报告中所述,鉴于使用的两个“className”字段之间存在差异,一种方法可能错误地依赖其中一个并导致未定义的行为。
但是,我更困惑,为什么将“类”称为Interface。
- 如果它真的是一个接口,我们一开始就不会遇到问题,因为接口只允许常量。在这种情况下,getter 和 setter 就足够了。
- 如果它真的是一个类,那么应该从名称中删除“接口”。否则,错误的名称只会妨碍理解,并可能导致将来出现意想不到的副作用。
推荐阅读
- sap - SAP BusinessObject Webi - 将 Excel 数据提供程序中的值与 Universe 中的变量匹配
- javascript - django成功功能中的ajax不起作用
- python - 我正在尝试显示 wordcloud 图像,但出现 ValueError: We need at least 1 word to plot a word cloud, got 0
- html - 当我开始页面或点击任何地方时,如何让我的单选按钮已经被选中
- kotlin - LiveData 时 RecyclerView 会自动更新吗
- > 如果我使用 BindingAdapter 会改变吗?
- c++ - 在动态加载的 DLL 中声明和初始化的静态成员变量的寿命
- java - 如何在 Java 中的字符串中查找特定单词
- firebase - 如何修复“processorListFile”不存在。在颤振中构建appbundle时
- django - 如何在 django 中执行会话?
- google-cloud-platform - 无法从数据洞察连接中列出 Bigquery 项目