2015-05-20 18 views
9

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)?

Trả lời

1

Tôi sẽ tải xuống tệp nhị phân PMD và sử dụng trình thiết kế, bạn sẽ có thể xem biểu thức có PrimaryExpression và PrimaryPrefix của 'Name: Optional.ofNullable', sau đó bạn có thể kiểm tra các đối số PrimarySuffix để tìm phương thức gọi hoặc biến. Sau đó, bạn sẽ phải xem lại tệp lớp để tìm các loại và sử dụng các loại đó để xác định xem bạn đã tùy chọn không đúng giá trị được tự động đóng hộp hay chưa.

Cá nhân tôi sẽ thực hiện điều này dưới dạng quy tắc Java không phải là quy tắc XPath.

Xem http://pmd.sourceforge.net/pmd-4.3.0/howtowritearule.html để biết thêm chi tiết

Các vấn đề liên quan