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?
Trả lời
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.
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. –
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
@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
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.
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ể.
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. –
Ồ, được rồi. Thay đổi ví dụ. – ykaganovich
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
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.
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
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ụ.
- 1. Sự khác biệt giữa trình khởi tạo cá thể và hàm tạo là gì?
- 2. Tôi nên tạo một vectơ khởi tạo như thế nào?
- 3. Làm thế nào để khởi tạo một đối tượng với một hàm tạo riêng trong C#?
- 4. Làm thế nào tôi có thể khởi tạo mảng char trong một hàm tạo?
- 5. Có một hàm khởi tạo tĩnh hoặc trình khởi tạo tĩnh trong Python không?
- 6. Làm thế nào tôi có thể khởi tạo một lớp đang có hàm tạo riêng tư
- 7. Làm thế nào để tạo và khởi tạo một mảng với mảng khác?
- 8. C# gọi một hàm khởi tạo từ phần thân khác
- 9. Cách khởi tạo IDictionary trong hàm tạo?
- 10. Danh sách khởi tạo hàm tạo dài
- 11. Tôi có thể tạo kiểu cơ bản C++ tự khởi tạo như thế nào?
- 12. Tạo trình khởi tạo
- 13. Khởi tạo Boost shared_ptr trong hàm tạo
- 14. Hàm khởi tạo trống hoặc không có hàm tạo nào
- 15. Tại sao tôi không thể khởi tạo một đối tượng chuỗi với một hàm tạo?
- 16. Liệu một hàm tạo hoặc hàm hủy 'rỗng' có thực hiện tương tự như một hàm tạo ra không?
- 17. Khởi tạo một lớp bằng trình khởi tạo siêu lớp
- 18. Cách khởi tạo một trường bit trong một hàm tạo
- 19. Gọi một hàm tạo để khởi tạo lại các biến dường như không hoạt động?
- 20. C++: danh sách khởi tạo hàm tạo cho một mảng?
- 21. C++: khởi tạo hàm tạo cho mảng
- 22. Phương thức khởi tạo tĩnh hoạt động như thế nào?
- 23. Làm thế nào để tạo một thể hiện đối tượng với RTTI trong Delphi 2010?
- 24. Có thể tạo một thể hiện của một đối tượng trong Java mà không cần gọi hàm tạo không?
- 25. Biểu thức để tạo một thể hiện với đối tượng khởi tạo
- 26. gọi một hàm khởi tạo từ một hàm khác trong java
- 27. Khởi tạo biến thể hiện trong Ruby
- 28. Các biến toàn cục được trình nạp elf khởi tạo như thế nào
- 29. C++ 11 khởi tạo vector trong một cuộc gọi hàm
- 30. Trong Java, một trường cuối cùng có thể được khởi tạo từ một trình trợ giúp hàm tạo không?
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). –