【问题标题】:Variable with same name in subclass and superclass子类和超类中同名的变量
【发布时间】:2019-02-19 00:05:34
【问题描述】:

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

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

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

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

    ...
}

【问题讨论】:

    标签: java variables subclass superclass findbugs


    【解决方案1】:

    是的,从子类中删除声明。并提供/离开,因为它们在上面的示例中是一个 getter,如果需要,一个 setter。如果该字段从未使用过,则可能只是在创建“CoreOutputInterface”时被忽略了,因为开发人员可能已经复制粘贴了“OutputInterface”,然后对其进行了相应的编辑。

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

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

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

    【讨论】:

    • 完美。谢谢你的回答:)
    猜你喜欢
    • 2014-11-22
    • 2013-01-10
    • 1970-01-01
    • 2016-05-27
    • 2015-03-09
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多