Trình tạo mã Trrift Apache tạo ra các lớp trông giống như thế này. Các lĩnh vực numCpus
là nullable, nhưng kể từ khi nó được tổ chức như một loại giá trị có một lĩnh vực isSet
để xác định nếu nó thực sự thiết lập:Có thể phát hiện hộp tự động trong quy tắc PMD không?
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
}
hướng dẫn phong cách của chúng tôi thích gói giá trị nullable như bắt buộc để chúng tôi không thể quên một null kiểm tra. Vì vậy, nó là phổ biến để xem chút mã này:
TaskConfig task = getTaskConfigFromWire();
Optional<Double> numCpus = Optional.ofNullable(task.getNumCpus());
Nhưng điều này là sai - nhờ autoboxing lập luận này không bao giờ có thể null
, và cuộc gọi chính xác nên trông giống như:
TaskConfig task = getTaskConfigFromWire();
Optional<Double> numCpus = task.isSetNumCpus()
? Optional.of(task.getNumCpus())
: Optional.<Double>empty();
Có cách viết quy tắc PMD để thực hiện cuộc gọi này (Optional.ofNullable
được gọi với một loại giá trị sẽ được tự động đóng hộp)?