2016-04-26 21 views
6

Trong mã nguồn android tôi thấy họ định nghĩa bốn biến nhưKhởi tạo int thành 0 hay không?

protected int mPaddingRight = 0; 
protected int mPaddingLeft = 0; 
protected int mPaddingTop; 
protected int mPaddingBottom; 

Trong Java, sự khác biệt trong khởi tạo một biến để 0 hoặc không phải là những gì? Tôi không hiểu rằng trong một số trình biên dịch, tôi không thể so sánh trừ khi tôi khởi tạo trường. Nhưng đó không phải là trường hợp ở đây. Điều này có liên quan đến tối ưu hóa không? Hay đây chỉ là thực hành mã hóa không phù hợp/không tốt?

+2

Không có sự khác biệt - thành viên int được khởi tạo thành 0 theo mặc định. –

+1

Tôi vẫn sẽ khởi tạo '0' nếu tôi muốn chúng là 0. Và kể từ khi tôi làm điều đó, bạn cũng nên! – Gendarme

Trả lời

8

Theo Java primitive data types turorial, tất cả các loại dữ liệu nguyên thủy đều có giá trị mặc định. Vì vậy, khởi tạo nó ngầm. Một thực hành tốt: khởi tạo các giá trị trước khi sử dụng để ngăn chặn hành vi không mong muốn.

byte 0 
short 0 
int 0 
long 0L 
float 0.0f 
double 0.0d 
char '\u0000' 
String (or any object)  null 
boolean false 
+0

Chà, rất nhiều câu trả lời tuyệt vời. Vì vậy, tôi chọn lâu đời nhất và bỏ phiếu cho những người khác. –

1

Như đã nêu trong nhận xét, không có khác biệt. Họ sẽ được initalized với 0 ngầm. Tuy nhiên, nếu bạn sử dụng IDE tốt hoặc có các công cụ khác, bạn sẽ dễ dàng tìm kiếm và thay thế = 0; bằng = SomeOtherValueHere;.

Ngoài ra tôi nghĩ rằng thực hành tốt là luôn luôn initialzie biến của bạn trước khi bạn truy cập chúng.

1

Thực hành mã hóa tốt để khởi tạo biến.

Từ Oracle Documents:

Nó không phải luôn luôn cần thiết để gán một giá trị khi một lĩnh vực được công bố. Các trường được khai báo nhưng chưa được khởi tạo sẽ được đặt thành mặc định hợp lý bởi trình biên dịch. Nói chung, mặc định này sẽ bằng 0 hoặc không, tùy thuộc vào loại dữ liệu. Tuy nhiên, dựa vào các giá trị mặc định này thường được coi là chương trình xấu .

Những lợi ích của khởi tạo các biến như sau:

  1. Làm cho nó dễ dàng hơn để làm theo mã của bạn
  2. Làm cho cuộc sống dễ dàng hơn cho các công cụ phân tích tĩnh.
  3. Hầu hết các mẫu thiết kế phổ biến đều yêu cầu bạn khởi tạo biến thành giá trị mặc định, để người lập trình biết chính xác giá trị mà biến được khởi tạo.
  4. Luôn luôn thực hành tốt để khởi tạo biến để ngăn chặn hành vi không xác định sau này trong chương trình.
  5. Gỡ lỗi trở nên dễ dàng hơn nếu bạn khởi tạo biến.
+0

Hmm. Không có chính xác "hành vi không xác định" ở đây. Tất cả đều được chỉ định. Các công cụ phân tích tĩnh cũng có thể giải quyết vấn đề đó. – Thilo

0

Những người khác đã chỉ ra rằng thuộc tính lớp được khởi tạo thành giá trị mặc định cho bạn.

Vì vậy, ngữ nghĩa, không có sự khác biệt nếu bạn cài đặt chúng một cách rõ ràng để 0 (hoặc, đối với thuộc tính đối tượng, thiết lập những để null.)

Tuy nhiên, có thể trên thực tế là một sự khác biệt ở cấp bytecode. Không có gì đảm bảo rằng mã chỉ khác nhau trong các thuộc tính lớp được ngầm định và được đặt rõ ràng thành các giá trị mặc định sẽ có cùng một byte bytecode.

Phiên bản cũ hơn của JDK được sử dụng để tạo mã lớn hơn và dài hơn để khởi tạo rõ ràng, dễ dàng kiểm tra với javap. (Thực tế này đôi khi được sử dụng làm cơ sở cho các câu hỏi phỏng vấn.) Tôi chưa kiểm tra các phiên bản JDK gần đây để xem liệu đây có phải là trường hợp không.

+0

Đối với việc bạn có _should_ khởi tạo thuộc tính lớp theo cách này hay không, ngay cả với các giá trị mặc định đã biết của chúng, thì nó đang tiến vào lãnh thổ thánh chiến. Cảm giác của tôi là các bộ khởi tạo mặc định rõ ràng là nhiễu và nên bỏ qua. Nếu một thuộc tính cần một initializer không mặc định, và thiết kế không muốn initializers static hoặc constructors (vì lý do nào) thì tôi giả sử ta có thể làm điều này miễn là có ý kiến ​​cho tại sao các giá trị ma thuật đang được sử dụng. Tuy nhiên, mọi cửa hàng Java tôi từng làm đều không bao giờ làm điều này. Tuy nhiên, những người phát triển C# đó đã khởi tạo _everything_. – jdv

+0

Mã dài hơn để có sự xâm nhập rõ ràng? Và tôi nghĩ tôi biết Java: D –

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