Trong Các tính năng ẩn của Java , câu trả lời hàng đầu đề cập đến Khởi tạo cú đúp , với cú pháp rất lôi cuốn:
Set<String> flavors = new HashSet<String>() {{
add("vanilla");
add("strawberry");
add("chocolate");
add("butter pecan");
}};
Thành ngữ này tạo ra một lớp bên trong ẩn danh chỉ với một trình khởi tạo cá thể trong đó, "có thể sử dụng bất kỳ phương thức [...] nào trong phạm vi chứa".
Câu hỏi chính: Đây có phải là không hiệu quả như nó có vẻ? Nên sử dụng nó để giới hạn một lần khởi tạo? (Và tất nhiên là thể hiện!)
Câu hỏi thứ hai: Hashset mới phải là "cái này" được sử dụng trong trình khởi tạo cá thể ... bất cứ ai cũng có thể làm sáng tỏ cơ chế này?
Câu hỏi thứ ba: Là thành ngữ này quá tối nghĩa để sử dụng trong mã sản xuất?
Tóm tắt: Câu trả lời rất, rất hay, cảm ơn mọi người. Đối với câu hỏi (3), mọi người cảm thấy cú pháp phải rõ ràng (mặc dù tôi muốn đề xuất một nhận xét không thường xuyên, đặc biệt là nếu mã của bạn sẽ chuyển cho các nhà phát triển có thể không quen thuộc với nó).
Đối với câu hỏi (1), mã được tạo sẽ chạy nhanh. Các tệp. Class bổ sung không gây lộn xộn tệp jar và khởi động chương trình chậm một chút (nhờ @coobird để đo lường điều đó). @Thilo chỉ ra rằng bộ sưu tập rác có thể bị ảnh hưởng và chi phí bộ nhớ cho các lớp được tải thêm có thể là một yếu tố trong một số trường hợp.
Câu hỏi (2) hóa ra là thú vị nhất đối với tôi. Nếu tôi hiểu câu trả lời, điều xảy ra trong DBI là lớp bên trong ẩn danh mở rộng lớp của đối tượng được xây dựng bởi toán tử mới và do đó có giá trị "này" tham chiếu đến thể hiện đang được xây dựng. Rât gọn gang.
Nhìn chung, DBI gây ấn tượng với tôi như một sự tò mò trí tuệ. Coobird và những người khác chỉ ra rằng bạn có thể đạt được hiệu quả tương tự với Arrays.asList, các phương thức varargs, Google Collection và các bộ sưu tập Java 7 Collection được đề xuất. Các ngôn ngữ JVM mới hơn như Scala, JRuby và Groovy cũng cung cấp các ký hiệu ngắn gọn để xây dựng danh sách và tương thích tốt với Java. Cho rằng DBI làm tắc nghẽn đường dẫn lớp, làm chậm quá trình tải lớp một chút và làm cho mã trở nên khó hiểu hơn, có lẽ tôi sẽ né tránh nó. Tuy nhiên, tôi dự định sẽ giới thiệu điều này với một người bạn vừa nhận được SCJP của anh ấy và yêu thích những câu nói tốt bụng về ngữ nghĩa Java! ;-) Cảm ơn mọi người!
7/2017: Baeldung có một bản tóm tắt tốt về khởi tạo niềng răng đôi và coi đó là một mô hình chống.
12/2017: @Basil Bourque lưu ý rằng trong Java 9 mới, bạn có thể nói:
Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
Đó là chắc chắn con đường để đi. Nếu bạn bị mắc kẹt với phiên bản cũ hơn, hãy xem Bộ sưu tập bất biến của Google Bộ sưu tập .
Set<String> flavors = Set.of( "vanilla" , "strawberry" , "chocolate" , "butter pecan" ) ;
flavors
là mộtHashSet
, nhưng than ôi nó là một lớp con ẩn danh.