首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

pmd规则在对象构造期间调用的可覆盖方法

首先,我们需要了解PMD规则是什么。PMD(Project Mess Detector)是一个用于Java、Scala、Kotlin等编程语言的静态代码分析工具,它可以帮助开发人员发现代码中的问题和潜在的错误。PMD规则是PMD工具中的一组预定义的规则,用于检查代码是否符合一定的编程规范和最佳实践。

在对象构造期间调用可覆盖方法是指在对象的构造函数中调用了可以被子类覆盖的方法。这种做法可能会导致一些问题,因为在子类中的构造函数被调用之前,可覆盖方法可能会被调用,从而导致子类中的方法不能正常工作。

为了解决这个问题,可以采用以下几种方法:

  1. 避免在构造函数中调用可覆盖方法。可以将这些方法的调用移到对象初始化完成后的其他方法中,或者将这些方法设置为final,以防止子类覆盖它们。
  2. 使用构造函数链(Constructor Chaining)。在子类中,可以通过调用父类的构造函数来确保父类中的可覆盖方法在子类中的方法之前被调用。
  3. 使用初始化块(Initialization Blocks)。可以使用静态初始化块或实例初始化块来初始化对象,从而避免在构造函数中调用可覆盖方法。

总之,在对象构造期间调用可覆盖方法可能会导致一些问题,因此应该避免这种做法。可以使用上述方法来解决这个问题,以确保代码的正确性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

JavaScript this 小结纯粹函数调用作为对象方法调用作为构造函数调用apply 调用

JavaScript 语言一个关键字。 它是函数运行时,函数体内部自动生成一个对象,只能在函数体内部使用。 ? 上面代码中,函数test运行时,内部会自动有一个this对象可以使用。...下面分情况,详细讨论 纯粹函数调用 函数最通常用法,属全局性调用,this即代表全局对象。 ?...运行结果是1 作为对象方法调用 函数还可以作为某个对象方法调用,这时this就指这个上级对象 ? 结果:1 作为构造函数调用 通过这个函数,可以生成一个新对象。this就指这个新对象。 ?...运行结果为1 为了表明这时this不是全局对象,我们对代码做一些改变: ? 运行结果为2,表明全局变量x值根本没变。 apply 调用 apply()是函数一个方法,作用是改变函数调用对象。...它第一个参数就表示改变后调用这个函数对象。因此,这时this指就是这第一个参数。 ? apply()参数为空时,默认调用全局对象。因此,这时运行结果为0,证明this指的是全局对象

2.7K20

【C++】继承 ⑧ ( 继承 + 组合 模式对象 构造函数 和 析构函数 调用规则 )

一、继承 + 组合 模式对象 构造函数和析构函数调用规则 1、场景说明 如果一个类 既 继承了 基类 , 又 类中 维护了一个 其它类型 成员变量 , 那么 该类 构造 与 析构 , 就需要涉及到...类 本身 构造函数 和 析构函数 , 父类 构造函数 和 析构函数 , 类 成员变量 构造函数 和 析构函数 ; 2、调用规则 继承 + 组合 情况下 , 构造函数 与 析构函数 调用规则如下...: 构造函数 : 父类 -> 成员 -> 自身 ; 首先 , 调用 父类 构造函数 ; 然后 , 调用 成员 构造函数 ; 也就是 成员变量 类型 构造函数 ; 最后 , 调用 自己 构造函数 ;...<< "C 析构函数调用" << endl; } public: int z; D d; }; 可根据下面的调用规则 , 分析出 C 类对象中 , 涉及到 父类构造/析构函数 , 自身构造/析构函数...; A 和 B 构造函数 , 是 父类构造函数 ; D 构造函数 , 是 成员构造函数 ; C 构造函数 , 是 自身构造函数 ; 构造函数调用顺序为 : 父类 -> 成员 -> 自身 , 符合上述调用原则

18610
  • 创建子类对象时,父类构造函数中调用被子类重写方法为什么调用是子类方法

    static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建A对象时候父类会调用子类方法...但是:创建B对象父类会调用父类方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...如果,子类重写了父类方法,子类方法引用会指向子类方法,否则子类方法引用会指向父类方法引用。 如果子类重载了父类方法,则子类重载方法引用还指向子类方法。...如果子类方法没有重写也没有重载父类方法,则方法引用会指向父类方法。 当子类对象创建时,会先行调用父类构造方法构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。...其结果是当编译时候,父类构造方法调用方法参数已经强制转换为符合父类方法参数了。 上边代码在编译前已经转换为下面这个样子了。

    6.2K10

    当类中方法全部都是 static 关键字修饰时 ,它构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象调用,需要调用构造方法。 但 static

    当类中方法全部都是 static 关键字修饰时 ,它构造方法最好作为 private 私有化,理由是方法全是 static, 不知道的人会去new对象调用,需要调用构造方法。...但 static方法直接用类名调用就行!...其实这个特点也是告诉我们什么时候使用静态?     如果某个成员变量是被所有对象共享,那么它就应该定义为静态。   ...可以通过类名调用。     其实它本身也可以通过对象调用。     推荐使用类名调用。     静态修饰内容一般我们称其为:与类相关,类成员。...注意事项     a:静态方法中是没有this关键字       如何理解呢?

    1.1K20

    为什么Iteratorremove方法保证从源集合中安全地删除对象,而在迭代期间不能直接删除集合内元素

    Iterator 支持从源集合中安全地删除对象,只需 Iterator 上调用remove()即可。...有些集合不允许迭代时删除或添加元素,但是调用 Iterator remove() 方法是个安全做法。 那么为什么用Iterator删除时是安全呢?...在他remove函数中可以看到下面的一句话,首先其实还是调用了ArrayListremove函数 ArrayList.this.remove(lastRet) 但是调用完该函数后,他又进行了如下操作...所以 Iterator 工作时候是不允许被迭代对象被改变。...但你可以使用 Iterator 本身方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象同时维护索引一致性。

    5.8K31

    利用Jenkins pipeline配置测试工具

    PMD附带了许多可以直接使用规则,利用这些规则可以找出Java源程序许多问题。 此外,用户还可以自己定义规则。检查Java代码是否符合某些特定编码规范。...此外,用户还可以自己定义规则,检查Java代码是否符合某些特定编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread和Socket对象操作。 2.1.1建立Project。...类文件是否被执行; 分支覆盖率:度量if和switch语句分支覆盖情况,计算一个方法里面的总分支数,确定执行和不执行 分支数量; 方法覆盖率:度量被测程序方法执行情况,是否执行取决于方法中是否有至少一个指令被执行...; 指令覆盖:计数单元是单个java二进制代码指令,指令覆盖率提供了代码是否被执行信息,度量完全独立源码格式; 圈复杂度:(线性)组合中,计算在一个方法里面所有可能路径最小数目,缺失复杂度同样表示测试案例没有完全覆盖到这个模块...2.6SonarQube中加入PMD规则 第2.1节中,我们介绍了PMD,这里来介绍如何让SonarQube中加入PMD规则

    3.3K10

    添加PMD插件扫描潜在bug

    未使用代码(rulesets/unusedcode.xml)—— 查找从未使用私有字段和本地变量、执行不到语句、从未调用私有方法,等等。...字符串(rulesets/string.xml)—— 找出处理字符串时遇到常见问题,例如重复字符串标量,调用 String 构造函数,对 String 变量调用 toString() 方法。...终结函数(finalizer)—— 因为 Java 语言中, finalize() 方法不是那么普遍(我上次编写这个代码也经是好多年前事了),所以它们使用规则虽然很详细,但是人们对它们相对不是很熟悉...这类检查查找 finalize() 方法各种问题,例如空终结函数,调用其他方法 finalize() 方法,对 finalize() 显式调用,等等。...克隆(rulesets/clone.xml)—— 用于 clone() 方法规则

    1.3K30

    别再写狗屎代码了,推荐这 5 款 IDEA 插件,让你代码质量直接起飞!

    另外,如果你近期准备面试跳槽,建议Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。...三、PMD 1、整体介绍: PMD侧重面向安全编码规则,且具备一定数据流分析和路径分析能力,能力比CheckStyle稍微强点,并且 PMD 支持自定义规则PMD可以直接使用规则包括以下内容: 潜在...点击关注公众号,Java干货及时送达 3.3、配置检测规则: 通过 File > Settings > Other Settings > PMD 可以打开检测规则设置界面: “RuleSets...因为实际工作中,可能需要根据实际情况自定义检测规则,就可以通过这里导入,如果要使用它,需要在启动PMD进行检测时选择该自定义规则。...另外,IDEA 正版激活方法参考我之前分享教程:https://www.javastack.cn/intellij-idea-reactivation-succeed/ 四、FindBugs: 1

    2K10

    怎样编写高质量Java代码

    代码覆盖率:测试代码能运行到代码比率,你代码经过了单元测试了吗?是不是每个方法都进行了测试,代码覆盖率是多少?这关系到你代码功能性和稳定性。 依赖项分析:你代码依赖关系怎么样?...并且有调用方法 23.Variable “ABC” must match pattern “^[a-z][a-zA-Z0-9]*$” 变量“ABC”不符合命名规则“^[a-z][a-zA-Z0-9]...“getId不是继承方法,必须指定abstract,final或空”,如果你懒得方法上加“final”,这条规则也可以去掉。...扩展性。...即如果这个类不调用任何其他包,则它是最稳定。 D(Distance) 被分析package和理想曲线A+I=1垂直距离,用于衡量package稳定性和抽象性之间平衡。

    1.2K10

    使用Eclipse插件提高Java编码质量

    代码覆盖率:测试代码能运行到代码比率,你代码经过了单元测试了吗?是不是每个方法都进行了测试,代码覆盖率是多少?这关系到你代码功能性和稳定性。 依赖项分析:你代码依赖关系怎么样?...代码重复:PMDCPD 插件 代码覆盖率:Eclemma 插件 依赖项分析:JDepend 插件 复杂度分析:Eclipse Metric 插件 注:某些插件需要访问外国网站才能更新 1....并且有调用方法  23.Variable “ABC” must match pattern “^[a-z][a-zA-Z0-9]*$”       变量“ABC”不符合命名规则“^[a-z][a-zA-Z0...“getId不是继承方法,必须指定abstract,final或空”,如果你懒得方法上加“final”,这条规则也可以去掉。 ...,用于衡量package扩展性。

    1.7K70

    用 Eclipse 插件提高代码质量

    事实上,您想要确保是:下列使用 Eclipse 插件规则就是应用到构建过程中规则。 安装 Eclipse 插件 安装 Eclipse 插件再简单不过了,只需要几个步骤。...像 CheckStyle 这样工具可以协助寻找那些影响到可维护性、与编码标准相冲突地方,比方说,过大类、太长方法和未使用变量等等。...Eclipse 中 CheckStyle 代码冲突列表 使用 CheckStyle 插件 Eclipse 内嵌入编码标准检验是一种很棒方法,用这种方法可以在编码时 积极地改进代码,从而在开发周期早期发现源代码中潜在缺陷...为 Eclipse 中使用这项便利工具,需要安装具有 PMD Eclipse 插件,该插件具有 CPD 功能。...使用 JDepend 进行依赖项检查 JDepend 是个可免费获取开源工具,它为包依赖项提供面向对象度量值,以此指明代码库弹性。

    94030

    配置Android项目 - 静态代码分析工具

    有助于保持你代码健康,并保持代码质量。 Android上,最流行代码分析工具是: Lint PMD Findbugs 我通常将静态代码分析脚本和相关文件保存在单独文件夹中。...注意:还有其他方法去压制findbugs警告。有关findbugs更多信息,请访问官方网站。 PMD PMD是一个源代码分析器。...它发现常见编程缺陷,如未使用变量,空catch块,不必要对象创建等等。 配置 要添加pmd到你android项目那么需要创建script-pmd.gradle文件。 ?...重要pmd选项: ruleSetFiles —pmd规则集文件路径,你可以在其中压制问题并定义要跟踪问题。...当你打开pmd.html报告文件,你将看到问题列表与说明和如何解决它们建议。 ? 如果你想忽略此问题,请将以下规则添加到rules-pmd.xml文件中。 ? 注意:还有其他方法压制pmd警告。

    68220

    19.Swift学习之构造函数与析构函数

    重要说明 本文中提到构造函数,很多书中有其他说法,如构造器,构造方法,初始化,初始函数等 本文中提到析构函数,很多书中有其他说法,如反构造器,析构方法,反初始化,反初始函数等 构造函数介绍...默认构造函数 创建类和结构体实例时必须为所有的存储属性设置一个合适初始值,如果不是定义时初始化值,可以构造函数中赋值 构造函数就像一个没有形式参数实例方法,使用 init 关键字来写 init...很多时候,我们创建一个对象时就会给属性赋值 可以自定义构造函数 注意:如果自定义了构造函数,会覆盖init()方法.即不在有默认构造函数 class Person: NSObject {...: convenience init(parameters) { statements } 类类型构造函数委托 为了简化指定和便捷构造函数之间调用关系,Swift 构造函数之间委托调用有下面的三个规则...规则 2——便捷构造函数必须从相同类里调用另一个构造函数。 规则 3——便捷构造函数最终必须调用一个指定构造函数。 简单记忆这些规则方法如下: 指定构造函数必须总是向上委托。

    1K30
    领券