gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:37 24 4
gpt4 key购买 nike

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
}

我们的风格指南更喜欢将可为 null 的值包装为 Optional,这样我们就不会忘记 null 检查。所以看到这段代码很常见:

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 规则(Optional.ofNullable 以将自动装箱的值类型调用)?

最佳答案

我会下载 PMD 二进制文件并使用设计器,您将能够看到表达式如何具有 PrimaryExpression 和 PrimaryPrefix 为“Name: Optional.ofNullable”,然后您可以检查 PrimarySuffix Arguments 以找到方法调用或多变的。然后,您必须查看类文件以找到类型并使用它来确定您是否错误地可选化了一个自动装箱的值。

我个人会将此作为 Java 规则而不是 XPath 规则来实现。

参见 http://pmd.sourceforge.net/pmd-4.3.0/howtowritearule.html了解更多详情

关于java - 是否可以在 PMD 规则中检测自动装箱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30361186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com