【发布时间】:2015-05-20 22:04:19
【问题描述】:
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
}
我们的样式指南更喜欢将可空值包装为 Optional,这样我们就不会忘记空值检查。所以看到这段代码很常见:
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 调用的值类型将被自动装箱)?
【问题讨论】: