子类和超类中具有相同名称的变量

时间:2018-09-14 08:02:50

标签: java variables subclass superclass findbugs

我目前正在处理另一个人项目的一些Findbugs问题。
这是我正在研究的问题:

  

正确性-类定义掩盖超类字段的字段
  此类定义与超类中的可见实例字段同名的字段。这令人困惑,并且如果方法在需要一个字段时更新或访问一个字段,则可能会指示错误。

有超类OutputInterface和子类CoreOutputInterface扩展了OutputInterface。它们都定义了变量classNameCoreOutputInterface也有一些子类。

要解决此问题,我只需从子类(className)中删除CoreOutputInterface,因为它已在超类中定义。
永远不要使用super.classNamethis.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;
    }

    ...
}

1 个答案:

答案 0 :(得分:2)

是的,从子类中删除声明。并按照示例中的方法在getter和setter上方提供/离开。如果该字段从未使用过,则在创建“ CoreOutputInterface”时可能会被忽略,因为开发人员可能复制粘贴了“ OutputInterface”,然后进行了相应的编辑。

从理论上讲,根据类的复杂性和用法,这已经成为或可能成为已知的 SOLID OOP设计原则中破损的 Liskov替换原理的一个示例。它指出,超类对象必须始终可替换为其子类的对应部分。鉴于报告中使用的两个“ className”字段之间存在差异,因此一种方法可能会错误地依赖一个或另一个,从而导致不确定的行为,如报告中所述。

但是,我更困惑为什么将“类”称为接口

  • 如果它确实是一个接口,那么我们就不会遇到这个问题,因为接口只允许使用常量。在那种情况下,getter和setter就足够了。
  • 如果它确实是一类,则应从名称中删除“接口”。否则,错误的名称只会妨碍理解,并可能在将来导致意外的副作用。