CodeQL 文档

令人困惑的非包私有方法覆盖

ID: java/non-overriding-package-private
Kind: problem
Security severity: 
Severity: warning
Precision: medium
Tags:
   - maintainability
   - readability
Query suites:
   - java-security-and-quality.qls

单击以在 CodeQL 存储库中查看查询

如果方法声明为默认访问权限(即不是私有、受保护或公共),则它只能被同一包中的方法覆盖。如果在不同包中的子类中定义了相同签名的方法,则它是一个完全独立的方法,不会发生覆盖。

对于其他程序员来说,这样的代码可能会令人困惑,他们必须理解不存在覆盖关系,检查原始程序员是否没有打算让一个方法覆盖另一个方法,并避免意外混淆这两个方法。

建议

在有意不覆盖的情况下,最佳解决方案是重命名其中一个或两个方法以阐明其不同的目的。

如果一个方法应该覆盖在另一个包中以默认访问权限声明的另一个方法,则该方法的访问权限必须更改为 publicprotected。或者,必须将类移动到同一个包中。

示例

在以下示例中,PhotoResizerWidget.width 不覆盖 Widget.width,因为一个方法在包 gui 中,另一个方法在包 gui.extras 中。

// File 1
package gui;

abstract class Widget
{
    // ...

    // Return the width (in pixels) of this widget
    int width() {
        // ...
    }

    // ...
}

// File 2
package gui.extras;

class PhotoResizerWidget extends Widget
{
    // ...
 
    // Return the new width (of the photo when resized)
    public int width() {
        // ...
    }
   
    // ...
}

假设无意覆盖,则应重命名其中一个或两个方法。例如,PhotoResizerWidget.width 最好重命名为 PhotoResizerWidget.newPhotoWidth

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私