2016-01-20 19 views
5

tôi có phương pháp Java sau:PMD UselessParentheses vi phạm

private int calculate() { 
    return (bytes[0] & 0xff) + ((bytes[1] & 0xff) << 8); 
} 

PMD phàn nàn về mã này với "UselessParentheses" vi phạm.

Tôi đã xem xét operator precentence rules và tôi vẫn không thấy dấu ngoặc đơn thừa trong mã đó. Tui bỏ lỡ điều gì vậy?

+0

Di ngoặc trong khối này: (byte [0] & 0xff) – eg04lt3r

+10

Quan trọng hơn, thậm chí nếu có một cặp thừa ngoặc (Tôi không thể nhìn thấy bất kỳ), mã sẽ ít có thể đọc được nếu không có nó. Cách này được viết truyền tải chính xác những gì logic của bạn là có nghĩa là để làm. – biziclop

+0

Xin lỗi, lỗi của tôi, xóa dấu ngoặc đơn trong (byte [0] & 0xff). Hoặc bạn có thể thêm cảnh báo ngăn chặn cho PMD cho phương pháp này. – eg04lt3r

Trả lời

5

Không có ngoặc không cần thiết trong mã này, như bạn có thể thấy nếu bạn chạy này:

 byte [] bytes = new byte[] {1,2}; 

     System.out.println((bytes[0] & 0xff) + ((bytes[1] & 0xff) << 8)); 
     System.out.println(bytes[0] & 0xff + ((bytes[1] & 0xff) << 8)); 
     System.out.println((bytes[0] & 0xff) + (bytes[1] & 0xff) << 8); 
     System.out.println((bytes[0] & 0xff) + (bytes[1] & 0xff << 8)); 

Hơn nữa, đôi khi nó thực sự tốt để thêm dấu ngoặc thêm cho dễ đọc. Ví dụ:

int i = x << y + z; // this will shift x by y+z bits 
int j = x << (y + z); // equivalent, but more readable 
+1

FYI: Điều này đã được sửa với PMD 5.3.5 ([bug # 1407] (https://sourceforge.net/p/pmd/bugs/1407)). Vì vậy, - cập nhật PMD nên thoát khỏi sự vi phạm sai lầm này. – adangel

3

Sau khi đọc các ưu đãi nhà điều hành, các dòng mã, và cảnh báo PMD, đây có lẽ là một trong những trường hợp hiếm hoi nơi ưu tiên có nghĩa là để được áp dụng như

PMD complains on this code with a useless (parenthesis warning) 

hơn

PMD complains on this code with a (useless parenthesis) warning. 

Mã của bạn là đúng và dấu ngoặc đơn không thừa. Loại bỏ chúng sẽ làm cho mã ít đọc được, và mỗi một trong số chúng là cần thiết. Trong thực tế, toàn bộ vấn đề này là xứng đáng với một xkcd comic