【问题标题】:Avoid The overriding method merely calls the same method defined in a superclass Sonar violation in multiple inheritance避免重写方法仅调用超类中定义的相同方法 Sonar 违反多重继承
【发布时间】:2014-09-12 14:35:38
【问题描述】:

我有一个类,比如说 BImpl,它实现了 B 接口和 C 抽象类。两个超类都有一些方法,比如在抽象类 C 中实现的 doSomething()。

interface B
{
 Some doSomething();
}

abstract class C
{
 protected Some doSomething()
 {
   //Do something here...
 }
}

我实现 BImpl 如下:

class BImpl extends C implemensts B
{
  public Some doSomething()
  {
    super.doSomething()
  }
}

所以我用 B 类型对象公开抽象类行为。在这种情况下,我得到 PMD(声纳)违规,说“重写方法仅调用超类中定义的相同方法”。 这对我来说完全不对,因为我暴露了其他父母的行为。我怎样才能避免这种情况?

【问题讨论】:

    标签: java sonarqube pmd


    【解决方案1】:

    这是此 PMD 规则和相关 Squid(SonarQube 内部)规则的 known limitation。请随意投票支持在 Java 插件的下一版本中解决此问题。

    【讨论】:

    • 是的,同意你的看法。但我的情况有点不同。我覆盖了一个父级,并在其中调用了相同方法签名的其他父级实现。因此,这将是另一个需要考虑使用此规则的场景。我说的对吗?
    【解决方案2】:

    1) 看起来您错过了输入的 implementation 。它应该如下所示:

    class BImpl extends C implements B
    {
      public Some doSomething()
      {
        super.doSomething()
      }
    }
    

    因为类不能扩展接口或实现抽象类。

    2) 根据我对您的问题的理解,在 BImpl 中执行 doSomething() 是多余的。

    Class BImpl extends C implements B {
    
    }
    

    在逻辑上等价于上述实现。 这就是 SONAR 违规的原因。 好吧,如果 BImpl 中的 doSomething() 与抽象类中的逻辑不同。我不认为 SONAR 会给出任何违规,因为不会有多余的逻辑。

    【讨论】:

      【解决方案3】:

      如果您不同意某些 Sonar 规则,这并没有错,默认配置文件中的某些规则是有争议的,只需从您用于分析项目的配置文件中禁用,下次分析后违规将消失.

      【讨论】:

        【解决方案4】:

        只是一个想法,类型转换?

        public Some doSomething(){
          ((B)this).doSomething()
        }
        

        【讨论】:

          猜你喜欢
          • 2018-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-09
          • 2019-01-19
          • 1970-01-01
          • 2011-02-20
          • 2011-08-13
          相关资源
          最近更新 更多