2009-08-31 34 views
61

Nói cách khác, tại sao bạn cần một trình khởi tạo thể hiện? Sự khác biệt hoặc lợi thế nào bạn có khi viết một trình khởi tạo thể hiện trên một hàm tạo?Trình khởi tạo thể hiện khác với một hàm tạo như thế nào?

+1

Trình khởi tạo thể hiện khá hiếm (trừ khi bạn nhập mã từ người nào đó quan tâm đến thành ngữ cú đúp). –

Trả lời

88

này dường như để giải thích nó cũng:

initializers Instance là một lựa chọn hữu ích để dụ biến initializers bất cứ khi nào:

  • đang khởi tạo phải bắt ngoại lệ, hoặc

  • thực hiện các phép tính ưa thích không thể được biểu diễn bằng trình khởi tạo biến thể hiện. Bạn có thể, tất nhiên, luôn viết mã như vậy trong các nhà thầu .

Nhưng trong một lớp học mà đã có nhiều nhà xây dựng, bạn sẽ phải lặp lại các mã trong mỗi nhà xây dựng. Với một trình khởi tạo thể hiện, bạn chỉ có thể viết mã một lần và nó sẽ được thực thi bất kể hàm tạo của là gì để tạo đối tượng. Trình khởi tạo thể hiện là cũng hữu ích trong các lớp bên trong vô danh, mà không thể khai báo bất kỳ nhà xây dựng nào cả.

Từ: JavaWorld Object initialization in Java.

+14

Mặt khác, bạn có thể viết mã một lần trong một hàm tạo và chỉ gọi nó từ tất cả các hàm tạo khác. Nhưng các lớp bên trong vô danh tạo nên một điểm tốt. –

+10

Bạn có thể gọi nó từ các nhà xây dựng khác - nhưng sau đó bạn lại lặp lại cuộc gọi. Nếu bạn thêm một hàm tạo mới, bạn phải nhớ thêm cuộc gọi vào nó. Không phải như vậy với một khởi tạo thể hiện. – talonx

+5

@talonx, tôi đồng ý với lý lẽ của bạn về việc quên, nhưng việc sử dụng hành vi mặc định cũng không kém phần nguy hiểm. Khi một người ủng hộ đang đọc qua một hàm tạo trong mã kế thừa, một người không phải lúc nào cũng nhớ kiểm tra các trình khởi tạo thể hiện có thể có. Trong khi một init được sử dụng rõ ràng() sẽ nổi bật. – Assambar

7

Khi bạn có nhiều hàm tạo và muốn một số mã chung được thực hiện cho mỗi hàm tạo, bạn có thể sử dụng cá thể khởi tạo dụ. ​​Nó được gọi cho tất cả các hàm tạo.

18

Về mặt vòng đời đối tượng, không có sự khác biệt. Cả hai được gọi vào thời gian xây dựng, và hợp lý khối khởi tạo có thể được coi là một phần của xây dựng.

Ngữ nghĩa, một initializer là một công cụ tốt đẹp để có vì nhiều lý do:

initializer có thể cải thiện mã dễ đọc bằng cách giữ logic khởi bên cạnh các biến được khởi tạo:

public class Universe { 
     public int theAnswer; 
     { 
     int SIX = 6; 
     int NINE = 7; 
     theAnswer = SIX * NINE; 
     } 

     // a bunch of other vars 
    } 

vs

public class Universe { 
     public int theAnswer; 

     // a bunch of other vars 

     public Universe() { 
     int SIX = 6; 
     int NINE = 7; 
     theAnswer = SIX * NINE; 

     // other constructor logic 
     } 
    } 

Trình khởi chạy được gọi bất kể trong đó hàm tạo được sử dụng.

Trình khởi chạy có thể được sử dụng trong các lớp học ẩn danh bên trong, nơi các nhà thầu không thể.

+3

Những gì bạn có về mặt kỹ thuật của họ là "trình khởi tạo biến thể hiện" không phải là "trình khởi tạo cá thể" (một khối được lồng trực tiếp trong một lớp). Xem phần JLS phần thứ ba 8.6. –

+0

Ồ, được rồi. Thay đổi ví dụ. – ykaganovich

+0

Khối khởi tạo phiên bản không có tên như được hiển thị [ở đây] (http://www.javatpoint.com/instance-initializer-block). Phải không? Bạn đã đánh dấu mã khởi tạo đối tượng của mình bằng tên 'theAnswer'. Đúng không? hoặc tôi đang thiếu một cái gì đó. – RBT

4

Tôi sẽ tránh thành phần khởi tạo thể hiện nói chung - lợi thế thực sự duy nhất mà nó cung cấp cho các trình khởi tạo biến là xử lý ngoại lệ. Và vì một phương thức init (có thể gọi từ hàm tạo) cũng có thể thực hiện xử lý ngoại lệ và tập trung mã thiết lập của hàm tạo, nhưng có lợi thế là nó có thể hoạt động trên các giá trị tham số khởi tạo, tôi muốn nói rằng trình khởi tạo thể hiện là thừa, và do đó tránh được.

+1

Bạn sẽ phải gọi thủ công phương thức init trong TẤT CẢ các nhà thầu của bạn. – Stephan

+2

@Alex Điểm tốt, nhưng vì hầu hết các lớp với nhiều hàm tạo có logic chung, nên chúng có xu hướng gọi nhau. Ít nhất là trong hầu hết các lớp học của tôi. – CPerkins

0

Trình khởi tạo là cách chia sẻ mã giữa các hàm tạo và làm cho mã dễ đọc hơn nếu trình khởi tạo được sử dụng với khai báo biến.

Trình biên dịch Java sao chép các khối khởi tạo vào mọi hàm tạo. Do đó, cách tiếp cận này có thể được sử dụng để chia sẻ một khối mã giữa nhiều hàm tạo. Oracle documentation

4

lợi thế thực sự của các trình khởi tạo mẫu trên các hàm tạo được nhìn thấy khi chúng tôi sử dụng lớp bên trong vô danh.

Anonymous lớp bên trong không thể có một constructor (như họ đang giấu tên) ,nên họ là một phù hợp khá tự nhiên cho initializers dụ.

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