当前位置: 首页 > 知识库问答 >
问题:

是否可以在PMD规则中检测自动装箱?

章越
2023-03-14

Apache Thrift代码生成器生成类似于以下内容的类。NumCpus字段可以为空,但是由于它作为值类型保存,所以还有另一个isSet字段来确定它是否真的设置了:

public class TaskConfig extends TBase<TaskConfig, TaskConfig._Fields> {
  private boolean isSetNumCpus; // Actual implemntation is a bitfield.
  private double numCpus;

  public boolean isSetNumCpus() {
    return isSetNumCpus;
  }

  public double getNumCpus() {
    return numCpus;
  }

  public void setNumCpus(double numCpus) {
    this.numCpus = numCpus;
    this.isSetNumCpus = true;
  }

  // hashCode, equals, copy constructor, field enum etc. omitted
}

我们的样式指南更喜欢将可为空的值包装为可选值,这样我们就不会忘记空检查。所以很容易看到这段代码:

TaskConfig task = getTaskConfigFromWire();
Optional<Double> numCpus = Optional.ofNullable(task.getNumCpus());

但这是错误的-由于自动装箱,这个参数永远不会是null,正确的调用应该如下所示:

TaskConfig task = getTaskConfigFromWire();
Optional<Double> numCpus = task.isSetNumCpus()
    ? Optional.of(task.getNumCpus())
    : Optional.<Double>empty();

有没有办法编写PMD规则来捕获此调用(可选。of nullable使用将自动装箱的值类型调用)?

共有1个答案

訾高明
2023-03-14

我将下载PMD二进制文件并使用设计器,您将能够看到表达式如何具有PrimaryExpression和PrimaryPrefix'Name:Optional。ofNullable',则可以检查PrimarySuffix参数以查找方法调用或变量。然后,您必须查找类文件以找到类型,并使用该类型确定是否已错误地对自动装箱的值进行了选项化。

我个人会将其实现为Java规则,而不是XPath规则。

详情见http://pmd.sourceforge.net/pmd-4.3.0/howtowritearule.html

 类似资料:
  • 问题内容: 我是Java新手,因此对以下示例感到困惑。可以认为“ ==”符号会比较 Intger 和 Int中“自动装箱” Integer 之间的值,并比较Integer之间的引用地址吗? 那么双打和0/0呢? 结果是: 问题答案: 出现时,取消装箱将会进行。 例如: 但是何时出现,取决于情况。 如果boxing type出现在,它将进行比较。但是,如果base type出现在,而另一侧是boxi

  • 那么双打和0/0呢? 结果是:

  • 问题内容: 我需要将横幅图片动态加载到HTML5应用中,并且需要几个不同的版本以适合屏幕宽度。我无法正确确定手机的屏幕宽度,因此,我想到的唯一方法是添加div的背景图像,并使用@media确定屏幕宽度并显示正确的图像。 例如: 这可能吗,或者有人有其他建议吗? 问题答案: 不可以,内联样式属性中不能存在规则和媒体查询,因为它们只能包含声明。正如规范所说: 样式属性的值必须与CSS 声明块内容的语法

  • 问题内容: 例如,如果我具有以下HTML: 和这个CSS: 就像在脚本语言中一样,您具有通常在脚本顶部编写的通用函数,而每次需要使用该函数时,只需调用该函数即可,而不必每次都重复所有代码。 问题答案: 不,您不能从另一个引用一个规则集。 但是,您可以在样式表中的多个规则集上重用选择器, _并_在单个规则集上使用多个选择器通过用逗号分隔它们。 您还可以将多个类应用于单个HTML元素(class属性采

  • 问题内容: Eclipse支持增量编译。如果我保存一个源文件,那么它将编译修改后的文件。 在进行这样的增量编译后,是否还可以运行同一软件包的JUnit测试并在错误视图中显示失败。然后,我可以在同一视图中看到JUnit测试失败并编译错误,而无需执行其他操作。有没有可以做到的插件? 问题答案: 您必须查看以下插件: JUnit Max:不是免费的,由Kent Benk(TDD练习背后的人之一)开发;

  • 我正在尝试创建一个自定义规则,用于标记void方法中return语句的使用,例如: 我用以下XPath创建了一个自定义XPath规则: 但是当我将此规则导入Eclipse并对代码运行PMD时,它并没有标记我期望的方法,即与上述描述匹配的方法(包含返回的无效方法)。 有人知道这里有什么问题吗?我的XPath有问题吗?或者可能是别的原因? 我使用v3.2.6的插件,其中包含pmd14-4.2.5.ja