声纳重命名此方法;父类中有一个同名的“私有”方法

时间:2019-01-11 16:45:53

标签: java sonarqube software-quality

当我们使用父私有方法的相同名称时,Sonar抱怨类中的私有方法名称。在代码质量上,用父私有方法的相同名称定义私有方法的缺点是什么?

还是我们需要将其归类为误报

4 个答案:

答案 0 :(得分:2)

IMO,这是因为这可能会造成混淆。考虑以下内容,请阅读评论:

class Child extends Super{
   public void myMethod() {
     System.out.println("in child");
   }
 }

 class Super{
   public static void main(String[] args) {
    Super s = new Child(); 
    s.myMethod(); // At this point you might expect myMethod of child to be called if it'll call the Parent's since it is private.
  }
   private void myMethod() {
     System.out.println("in super");
   }
 }

答案 1 :(得分:2)

当子类中有一些与父类同名的方法时,乍一看,假设将被覆盖,否则将引起混乱。

文档提到了三种可能发生的情况:

  

父类方法是静态的,子类方法不是静态的。

     

子方法的参数或返回类型不同   包比父方法的包。

     

父类方法是   私人的。

还有建议:

  

但是如果意图确实是为了让子类方法有所不同,   然后应重命名该方法以防止混淆

因此,如果您真的想覆盖超类中的方法,建议您对其进行更改以避免混淆。

您可以在RSPEC-2177 - Sonar Rule Documentation

中查看示例

重命名方法或将出现的事件标记为误报的决定完全取决于团队如何组织其代码库以及开发人员之间使用的代码约定。

答案 2 :(得分:0)

IHMO,这条规则没有道理。
如果命名对于父类和子类都有意义,那么您将不会为其中之一命名其他名称以使Sonar感到满意。
它可能使代码不那么清晰,也可能使其与基本代码的同质性降低。 私有方法仅在当前类内部可见,因此足以确保此选择的安全。

答案 3 :(得分:0)

我了解规则的目的。但是,它不应应用于具有具体私有方法的抽象类。

我们正在使用Apache MINA库,该库在CumulativeProtocolDecoder中具有一些具体的私有方法,这些方法在其公共具体方法中被引用。如果公共方法被覆盖,我们将被迫提供私有方法的自己的实现。只是为了避免被Sonar打扮得不好,再给他们起其他名字是没有道理的。