2010-07-13 43 views
9

Có cách nào để Eclipse có thể đánh dấu việc sử dụng toán tử == để kiểm tra chuỗi bình đẳng không? Tôi vẫn sử dụng nhầm nó thay vì gọi số .equals().Đánh dấu khi toán tử bình đẳng (==) được sử dụng để so sánh chuỗi trong Eclipse

Tôi thực sự muốn đưa điều đó vào cảnh báo và yêu cầu chú thích @SuppressWarnings để loại bỏ nó, trong trường hợp chưa xảy ra mà tôi thực sự muốn so sánh các chuỗi cho bình đẳng đối tượng.

Có bất kỳ công cụ nào tôi có thể sử dụng để giúp phá vỡ thói quen xấu này tại thời điểm chỉnh sửa không?

Trả lời

10

Sử dụng công cụ static analysis chẳng hạn như FindBugs, PMD hoặc CheckStyle.

Có plugin Eclipse cho mỗi, cùng với nhiệm vụ Ant, Maven plugins vv

Mỗi có quy tắc liên quan đến chuỗi bình đẳng (Findbugs rule, PMD rule, Checkstyle rule).

+1

Tôi chắc chắn sẽ sử dụng Findbugs cho Eclipse lần thứ hai .... đã là một ơn trời cho việc bắt các loại mã hóa nhỏ này! – mikera

+1

tất cả chúng đều tuyệt vời, đặc biệt khi được sử dụng cùng nhau trên một máy chủ tích hợp liên tục như hudson (miễn là mọi người thực sự xem kết quả :-)) –

+1

bạn có biết liệu có bất kỳ phần mềm nào chạy trong thời gian chỉnh sửa không? chúng tôi đã chạy một vài trong số này như là một phần của bản dựng hàng đêm và tạo tệp báo cáo. tôi muốn một cái gì đó mà các lỗi/cảnh báo làm nổi bật ngay khi tôi gõ. –

5

Câu trả lời rõ ràng cho câu hỏi has already been given, nhưng đây là một cảnh báo không phải là câu trả lời trực tiếp: obj.equals cũng có thể thất bại nếu obj là null. Vì vậy, bạn sẽ thường xuyên phải sử dụng mã như thế này:

if(mystr1 != null && mystr1.equals(mystr2)) 

vì đây

if(mystr1.equals(mystr2)) 

sẽ thất bại với một NullPointerException nếu mystr1 là null.

Đó là lý do tại sao, khi so sánh chuỗi là một hằng số, cú pháp tiếng sau thường được sử dụng:

if("ABCDEF".equals(mystr1)) 

hơn

if(mystr1.equals("ABCDEF")) 

Vì lý do này, nhiều thư viện (như apache commons/lang) cung cấp các chức năng tiện ích kết hợp các kiểm tra này:

// this is the definition of org.apache.commons.lang.StringUtils.equals(String, String) 
public static boolean equals(String str1, String str2) { 
    return str1 == null ? str2 == null : str1.equals(str2); 
} 

// this is the definition of org.apache.commons.lang.ObjectUtils.equals(Object, Object) 
public static boolean equals(Object object1, Object object2) { 
    if (object1 == object2) { 
     return true; 
    } 
    if ((object1 == null) || (object2 == null)) { 
     return false; 
    } 
    return object1.equals(object2); 
} 

Sử dụng các phương pháp này thường an toàn hơn so với đồng bằng, trừ khi bạn biết chắc chắn rằng một trong hai đối tượng không phải là rỗng

1

Tôi không đồng ý với câu trả lời trước đó - đó là lỗi trong nhật thực và bạn có thể bỏ phiếu ở đây: https://bugs.eclipse.org/bugs/show_bug.cgi?id=39095.

Eclipse có thể rất tốt cảnh báo khi bạn so sánh Chuỗi với == vì điều này hiếm khi bạn muốn (hoặc tác giả gốc muốn).

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