2012-11-14 24 views
8

Tôi có một lớp Java như thế này:Ghi vào trường tĩnh - có phải FindBugs sai trong trường hợp này không?

public class Foo { 

    public static int counter = 0; 

    public void bar(int counter) { 
     Foo.counter = counter; 
    } 
} 

FindBugs cảnh báo tôi về văn bản cho lĩnh vực tĩnh counter qua phương pháp dụ bar. Tuy nhiên, nếu tôi thay đổi mã thành:

public class Foo { 

    public static int counter = 0; 

    public static void setCounter(int counter) { 
     Foo.counter = counter; 
    } 

    public void bar(int counter) { 
     setCounter(counter); 
    } 
} 

Sau đó FindBugs sẽ không phàn nàn. Điều đó có sai không? Tôi vẫn đang viết một trường tĩnh từ một phương thức thể hiện, chỉ thông qua một phương thức tĩnh, tôi có phải không?

+3

Hãy cho tôi biết khi công cụ tự động trở thành có thể phát hiện tất cả các loại lỗi lập trình, vì vậy tôi có thể bắt đầu tìm kiếm một sự nghiệp mới. – NullUserException

+0

Nhưng nó chỉ là một loại trong trường hợp này. : P Tôi mới sử dụng công cụ đó và chưa biết kết quả đáng tin cậy của nó như thế nào. :) – htorque

+1

Nếu FindBugs phát ra cảnh báo, bạn nên xem xét vấn đề. Nhưng điều đó không có nghĩa là nếu FindBugs không phát ra bất kỳ cảnh báo nào, thì mã của bạn là hoàn hảo và không có lỗi. –

Trả lời

13

Giả sử rằng tại một số thời điểm trong tương lai, bạn quyết định phương thức setter này cần phải là chủ đề an toàn và bạn muốn làm cho chuỗi đó là synchronized.

Mã này sẽ hoạt động tốt:

public synchronized static void setCounter(int counter) { 
    Foo.counter = counter; 
} 

public void bar(int counter) { 
    setCounter(counter); 
} 

Mã này là sai và sẽ có hành vi không đúng:

public synchronized void bar(int counter) { 
    Foo.counter = counter; 
} 

này có thể không có vẻ như một sự khác biệt đáng kể trong ví dụ giả tạo này, đặc biệt là kể từ khi counter thường chỉ có thể được đánh dấu volatile. Tuy nhiên, trong một ví dụ thế giới thực, nơi phương thức setter có logic phức tạp hơn và được gọi từ nhiều nơi khác nhau (không chỉ từ một phương thức mẫu), mẫu thứ hai sẽ dễ dàng hơn để cấu trúc lại.

Là một sang một bên, theo ý kiến ​​của tôi, Google's CodePro Analytix plugin là một công cụ nhanh hơn và toàn diện hơn FindBugs.

liên quan:

+0

CodePro AnalytiX có chạy dưới 4,2 (Juno) không? – erickson

+0

@erickson không chắc chắn ...công ty của tôi sử dụng một phiên bản Eclipse trong nhà tùy chỉnh, vì vậy tôi đã không phải sử dụng Eclipse vani trong một thời gian. – dbyrne

4

Từ danh sách FindBugs của bug descriptions:

ST: Viết thư cho lĩnh vực tĩnh từ phương pháp dụ (ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD)

Phương pháp thể hiện này ghi vào trường tĩnh. Điều này là khó khăn để có được chính xác nếu nhiều phiên bản đang được thao tác, và nói chung là xấu thực hành.

Không có mô tả lỗi tương tự để truy cập vào trường tĩnh thông qua phương pháp tĩnh được gọi từ phương pháp thể hiện.

Bạn có thể muốn thảo luận về lý do đằng sau quyết định này trên FindBugs mailing list

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