【问题标题】:PMD rules confliction:A method should have only one exit point, and that should be the last statement in the methodPMD规则冲突:一个方法应该只有一个退出点,并且应该是方法中的最后一个语句
【发布时间】:2017-08-30 16:01:24
【问题描述】:

有时我发现一些 PMD 规则相互冲突,因此您无法编写满足所有 PMD 规则的代码。

例如,以下两条规则似乎相互排斥: “将对象分配给 null 是一种代码味道。考虑重构。” 和 “一个方法应该只有一个退出点,并且应该是方法中的最后一条语句”

以下是我的示例代码:

如果我使用get1(),我将违反前一条规则,如果我使用get2(),那么我将违反后一条规则。我更喜欢 A 方法应该只有一个退出点,但我不希望 PMD 报告“将对象分配给 null 是一种代码味道”,有人有什么好主意吗?非常感谢:)

【问题讨论】:

    标签: java pmd


    【解决方案1】:

    在这两种情况下,我都会使用条件运算符:

    return condition > 5 ? Integer.valueof(123) : null;
    

    我个人试图坚持一个退出点。有太多次使代码 less 可读 - 通常你可以在方法的开头告诉返回值应该是什么(例如,由于它是一个基本情况)......那么为什么不直接退货呢?教条式地坚持“只有一个出口点”的代码通常会以不必要的嵌套代码结束,这样就更难浏览了。

    【讨论】:

    • 因为我写C代码很久了,我曾经让一个函数有一个退出点。现在从你的回复中我同意它会降低代码的可读性。我将关闭 PMD 的选项“OnlyOneReturn”以禁用该规则。
    • @soulmachine: 垃圾收集和异常的混合确实完全改变了什么是合适的:)
    【解决方案2】:

    使用

    return (condition > 5) ? Integer.valueOf(123) : null;
    

    但我不知道这是否也是“代码味道”... :)

    【讨论】:

    • PMD 报告“将对象分配给 null 是一种代码异味。考虑重构。”
    • 当然 :) 但这里我们有一个“return”语句,而不是一个赋值 ;) 显然,如果你做类似 Object obj = get2(); 的事情,那将是一个“代码气味”......但那是不是你问题的重点。无论如何,Jon Skeet 给你的响应是相当完整的,例子也完全一样。 :)
    【解决方案3】:

    只需删除第一种方法(get1)的else。 Java中的对象默认为null,不需要这个赋值(result = null)。

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 2012-07-07
      相关资源
      最近更新 更多