2014-11-19 26 views
33

Đây là một trong những quy tắc từ Googles tĩnh phân tích CodePro AnalytiX:Mảng không được khởi tạo tĩnh bởi bộ khởi tạo mảng. Tại sao?

Tóm tắt

Mảng không nên tĩnh khởi tạo bởi một initializer mảng.

Mô tả

kiểm toán này kiểm tra quy tắc cho biến mảng được khởi tạo (hoặc trong initializer hoặc trong một câu lệnh gán) sử dụng một initializer mảng.

Ví dụ

Việc kê khai mảng sau đây sẽ được gắn cờ vì việc sử dụng một initializer mảng:

int[] values = {0, 1, 2}; 

Bây giờ, tôi có thể vô hiệu hóa nó nếu tôi không thích nó, đó không phải là vấn đề. Nhưng tôi tự hỏi tại sao đây lại là một vấn đề, và giải pháp nào để giữ cho mã đó không bị kiểm soát bởi quy tắc kiểm toán?

+6

Dường như có một loạt quy tắc được xác định trước chỉ là vấn đề về hương vị để bạn có thể định cấu hình dễ dàng. Bằng cách xem [danh sách này] (https://developers.google.com/java-dev-tools/codepro/doc/features/audit/audit_rules_com.instantiations.assist.eclipse.auditGroup.codingStyle) Tôi tìm thấy rất nhiều quy tắc Tôi nhìn hoặc không có cơ sở hoặc thậm chí có vấn đề với tôi. – Holger

+0

điều này có ý nghĩa –

+0

Trình kiểm tra kiểm toán có khiếu nại nếu mảng đó là const không? Có lẽ họ không muốn các giá trị có thể được sửa đổi sau đó đi vào bất cứ điều gì khác hơn là lưu trữ đống năng động, do khả năng tràn bộ đệm, dẫn đến lỗ hổng bảo mật. – Marty

Trả lời

16

Đó là một câu hỏi thú vị và quyết định này là IMHO không có căn cứ. (Tôi hy vọng ai đó khác sẽ trả lời chủ đề này nếu có lý do chính đáng đằng sau quyết định thiết kế này).

Hơn nữa, Google hiển thị như thế nào để định dạng những initializers tĩnh trong thực tiễn tốt của họ định dạng hướng dẫn https://google-styleguide.googlecode.com/svn/trunk/javaguide.html#s4.8.3.1-array-initializers mà không nói bất cứ điều gì về cách xấu nó là sử dụng những cấu trúc ...

Tôi đoán rằng người đằng sau quy tắc mà chỉ có một cái răng chống lại kiểu lập trình đó :)

+3

Tôi không phủ nhận, tôi đã đăng nó như một câu trả lời vì nó dễ đọc hơn bình luận. Hơn nữa, tôi đoán là người ta chỉ có thể suy đoán về điều này, vì tôi không tìm thấy bất kỳ nguồn nào giải thích lý do tại sao quyết định đó. –

+1

Tôi nghĩ rằng nó thực sự phần nào trả lời câu hỏi "Nhưng tôi tự hỏi tại sao điều này sẽ là một vấn đề, và những gì sẽ là thực hành tốt nhất được đề nghị?". Nó được cho phép theo google styleguide. – Magnilex

+1

Phần có liên quan là "Google hiển thị cách định dạng các trình khởi tạo tĩnh đó trong hướng dẫn định dạng thực hành tốt" của chúng, mặc dù trình phân tích của chúng quy định chúng. Liên kết chỉ là một tham chiếu không cần thiết để nắm bắt quan điểm của tôi. –

11

Tôi nghĩ đó là vì nó là một cú pháp đặc biệt chỉ hoạt động khi khởi tạo values.

int[] values = {1,2,3} //legal 

int[] values2; 
values2 = {1,2,3} //not legal 


int [] values3; 
values3 = new int[]{1,2,3} //legal 

Biểu mẫu cuối cùng values3 là hình thức pháp lý khi tạo mảng hoặc sau này. Vì vậy, thay vì trộn các hình thức khởi tạo mảng, bạn nên sử dụng cùng một biểu mẫu luôn. IMHO làm cho mã rõ ràng hơn, theo nguyên tắc ít ngạc nhiên nhất.

Thật lạ là mặc dù google code style does không cấm hình thức khởi tạo này rất rõ ràng trong số example này.

+1

"Array Initializer" thực sự được sử dụng bởi [JLS] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6) đối với phần '{values}', tuy nhiên 'new int [] {1,2,3}' vẫn đang sử dụng bộ khởi tạo mảng ["như là một phần của biểu thức tạo mảng"] (https://docs.oracle.com /javase/specs/jls/se7/html/jls-15.html#jls-15.10). Câu hỏi là, liệu máy phân tích có ý nghĩa giống nhau không? – zapl

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/5387643/array-initialization-syntax-when-not-in-a-declaration –

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