ในคุณสมบัติที่ซ่อนของ Javaคำตอบด้านบนกล่าวถึงคู่รั้งการเริ่มต้นด้วยมากไวยากรณ์ล่อลวง:
Set<String> flavors = new HashSet<String>() {{
add("vanilla");
add("strawberry");
add("chocolate");
add("butter pecan");
}};
สำนวนนี้สร้างคลาสภายในที่ไม่ระบุชื่อโดยมีเพียง initializer อินสแตนซ์ซึ่งมัน "สามารถใช้วิธีการใด ๆ [... ] ในขอบเขตที่มี"
คำถามหลัก: นี่มันไม่มีประสิทธิภาพเท่าที่ฟังดูไหม? การใช้งานควรถูก จำกัด เพียงการเริ่มต้นครั้งเดียวหรือไม่? (และแน่นอนแสดงออก!)
คำถามที่สอง: HashSet ใหม่จะต้องเป็น "this" ที่ใช้ใน initializer อินสแตนซ์ ... ทุกคนสามารถแสดงความเห็นต่อกลไกได้หรือไม่?
คำถามที่สาม: สำนวนนี้คลุมเครือเกินไปที่จะใช้ในรหัสการผลิตหรือไม่
สรุป:คำตอบที่ดีมากขอบคุณทุกคน ในคำถาม (3) ผู้คนรู้สึกว่าไวยากรณ์ควรชัดเจน (แม้ว่าฉันจะแนะนำความคิดเห็นเป็นครั้งคราวโดยเฉพาะอย่างยิ่งหากรหัสของคุณจะส่งต่อไปยังนักพัฒนาซอฟต์แวร์ที่อาจไม่คุ้นเคย)
ตามคำถาม (1) รหัสที่สร้างขึ้นควรทำงานได้อย่างรวดเร็ว ไฟล์. class เพิ่มเติมทำให้เกิดความวุ่นวายของไฟล์ jar และการเริ่มต้นโปรแกรมช้าลงเล็กน้อย (ขอบคุณ @coobird สำหรับการวัดผล) @Thilo ชี้ให้เห็นว่าการเก็บรวบรวมขยะอาจได้รับผลกระทบและต้นทุนหน่วยความจำสำหรับคลาสที่โหลดเพิ่มอาจเป็นปัจจัยในบางกรณี
คำถาม (2) กลายเป็นว่าน่าสนใจที่สุดสำหรับฉัน ถ้าฉันเข้าใจคำตอบสิ่งที่เกิดขึ้นใน DBI คือคลาสภายในแบบไม่ระบุชื่อขยายคลาสของวัตถุที่สร้างโดยผู้ดำเนินการใหม่และด้วยเหตุนี้จึงมีค่า "นี่" อ้างอิงถึงอินสแตนซ์ที่กำลังสร้าง เรียบร้อยมาก
โดยรวมแล้ว DBI ทำให้ฉันเป็นสิ่งที่สงสัยทางปัญญา Coobird และคนอื่น ๆ ชี้ให้เห็นว่าคุณสามารถได้รับผลเช่นเดียวกันกับ Arrays.asList, วิธีการแปรผัน, คอลเลกชันของ Google และตัวอักษร Java 7 Collection ที่เสนอ ภาษา JVM ที่ใหม่กว่าเช่น Scala, JRuby และ Groovy ยังมีสัญลักษณ์ที่กระชับสำหรับการสร้างรายการและทำงานร่วมกันได้ดีกับ Java เนื่องจาก DBI จัดกลุ่ม classpath ให้ช้าลงการโหลดคลาสเล็กน้อยและทำให้โค้ดดูไม่ชัดเจนมากขึ้นฉันอาจอายไปจากมัน อย่างไรก็ตามฉันวางแผนที่จะสปริงเรื่องนี้กับเพื่อนที่เพิ่งได้รับ SCJP ของเขาและชอบการแข่งขันที่มีอัธยาศัยที่ดีเกี่ยวกับความหมายของ Java! ;-) ขอบคุณทุกคน!
7/2017: Baeldung มีการสรุปที่ดีของการเริ่มต้นวงเล็บปีกกาคู่และถือว่าเป็นรูปแบบการต่อต้าน
12/2017: @Basil Bourque ตั้งข้อสังเกตว่าใน Java 9 ใหม่คุณสามารถพูดได้:
Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
นั่นคือหนทางที่แน่นอน หากคุณติดอยู่กับรุ่นก่อนหน้านี้จะดูที่Google คอลเลกชัน ImmutableSet
Set<String> flavors = Set.of( "vanilla" , "strawberry" , "chocolate" , "butter pecan" ) ;
flavors
จะเป็นHashSet
แต่ทว่ามันเป็นคลาสย่อยที่ไม่ระบุชื่อ