JavaRush /จาวาบล็อก /Random-TH /การเริ่มต้นวงเล็บปีกกาคู่
Joysi
ระดับ

การเริ่มต้นวงเล็บปีกกาคู่

เผยแพร่ในกลุ่ม

1. การเริ่มต้นวงเล็บปีกกาคู่

การเริ่มต้นโดยใช้เครื่องหมายปีกกาคู่ ( ต่อไปนี้จะเรียกว่าการเริ่มต้นเครื่องหมายปีกกาคู่ ) เป็นเครื่องมือ Java สำหรับการสร้างคอลเล็กชัน เช่น รายการ เซ็ต และแมปพร้อมกันกับการประกาศ
การเริ่มต้นวงเล็บปีกกาคู่ - 1
เมื่อคุณต้องการรายการที่มีองค์ประกอบคงที่ เช่น รายการผลิตภัณฑ์หรือสกุลเงินที่รองรับ การประกาศรายการพร้อมกับการเริ่มต้นจะช่วยปรับปรุงความสามารถในการอ่านโค้ด นี่คือสาเหตุที่การกำหนดค่าเริ่มต้นด้วยปีกกาคู่กำลังได้รับความนิยม เนื่องจากไม่มีวิธีมาตรฐานอื่นสำหรับการสร้างคอลเลกชันที่มีการเริ่มต้นพร้อมกันในโค้ด น่าเสียดายที่ Java ไม่เหมือนกับภาษาโปรแกรมอื่นๆ ตรงที่ไม่รองรับคอลเลกชั่นตัวอักษร เนื่องจากข้อจำกัดนี้ การสร้าง unmodifiableList ที่มีองค์ประกอบเพียงเล็กน้อย บังคับให้เราเขียนโค้ดหลายบรรทัดในรูปแบบของการเรียกซ้ำๆadd()เพื่อเพิ่มองค์ประกอบที่ต้องการด้วยการสรุปขั้นสุดท้าย:
List<Integer> list = new ArrayList<>();
list.add(2);
list.add(3);
list.add(5);
list.add(7);
List<Integer> unmodifiableList = Collections.unmodifiableList(list);
นี่เป็นคำอธิบายที่ซ้ำซ้อนโดยไม่จำเป็นซึ่งสามารถทำให้ง่ายขึ้นได้ มาเติมรายการสแตติกในวิธีที่สะดวกสำหรับเรา กล่าวคือ ลงในบล็อกสแตติกโดยตรงระหว่างการกำหนดค่าเริ่มต้น ซึ่งเป็นสิ่งที่Double braceการกำหนดค่าเริ่มต้นจะช่วยเราได้ ทำให้เราสามารถเขียนทุกอย่างในบรรทัดเดียว:
List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>() {{
        add(2);
        add(3);
        add(5);
}});
ในทำนองเดียวกันDouble braceการเริ่มต้นจะช่วยเรากรอกค่าและHashMap:
Map<Integer, String> intToString = new HashMap<Integer, String>(){{
         put(1, "one");
         put(2, "two");
         put(3, "three");
 }};
ทุกอย่างดูหรูหรามาก แต่ก็มีข้อเสีย ซึ่งทำให้การเริ่มต้น Double Brace เป็นการต่อต้านรูปแบบ เราจะดูพวกเขาเพิ่มเติมในบทถัดไป

ข้อดีและข้อเสียของการเริ่มต้นวงเล็บปีกกาคู่

Doubleการเริ่มต้นรั้งใช้การสร้าง คลาส ภายใน ที่ไม่ระบุชื่อ สิ่งที่ซ่อนอยู่บนพื้นผิวในตอนแรก อย่างไรก็ตามDouble braceการกำหนดค่าเริ่มต้นจะสร้างคลาสที่มีการกำหนดค่าเริ่มต้นเพิ่มเติมให้กับอินสแตนซ์ทุกครั้งที่คุณใช้ นอกจากนี้ มีการใช้การอ้างอิงที่ซ่อนอยู่สำหรับคลาสส่วนตัวนี้ ซึ่งอาจทำให้หน่วยความจำรั่วได้ นอกจากนี้คุณยังไม่สามารถใช้ตัวดำเนินการ ghost สำหรับข้อมูลทั่วไปได้ (ตัวดำเนินการเพชร < >) เนื่องจากเราไม่สามารถเข้าถึงภายในของคลาสที่ไม่ระบุชื่อได้
(จากนักแปล: รายละเอียดเพิ่มเติมอีกครั้ง:
หลังจากครั้งแรก{คลาสที่ไม่ระบุชื่อภายในจะถูกสร้างขึ้น หลังจากครั้งที่สอง{การเริ่มต้นเกิดขึ้นเมื่อสร้างอินสแตนซ์ของคลาส ในระหว่างที่เราสามารถเข้าถึงฟิลด์และวิธีการของภายนอก ( สัมพันธ์กับคลาสที่ไม่ระบุชื่อ) คลาส)
ข้อดี:
  1. การลดบรรทัดในโค้ด
  2. การสร้างและการเริ่มต้นในหนึ่งนิพจน์
ข้อเสีย:
  1. การสร้างคลาสที่ไม่เปิดเผยตัวตนที่ซ่อนอยู่จากคุณ
  2. ซึ่งทำให้เราเสียค่าใช้จ่ายเพิ่มเติมสำหรับอินสแตนซ์ทุกครั้งที่เราใช้
  3. แต่ละครั้งที่มีการสร้างการอ้างอิงที่ซ่อนอยู่ซึ่งอาจทำให้หน่วยความจำรั่ว
คำตัดสิน:เนื่องจากข้อเสียข้างต้นและการมีอยู่ของทางเลือกอื่นนอกเหนือจาก Double Brace การเริ่มต้นจึงถูกมองว่าเป็นรูปแบบการต่อต้านในโลก Java บันทึกลูกแมว

ทางเลือกในการเริ่มต้นวงเล็บปีกกาคู่ใน Java

ข่าวดีก็คือมีวิธีอื่นในการบรรลุเป้าหมายเดียวกันใน Java เราสามารถใช้โค้ดหนึ่งบรรทัดในการสร้างและการเริ่มต้นของ ArrayList โดยใช้ Copy Constructor จากคลาส Collection ดังที่แสดงด้านล่าง:
List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Arrays.asList()จะส่งคืนรายการความยาวคงที่ที่ส่งไปยังArrayListตัวสร้างการคัดลอก โปรดคำนึงถึงความแตกต่างระหว่างรายการที่มีความยาวคงที่ที่ส่งคืนจากArrays.asList()และCollections.unmodifiableList(): คุณไม่สามารถเพิ่มหรือลบองค์ประกอบArrayListของ - ได้ แต่คุณสามารถเปลี่ยนองค์ประกอบตามดัชนีโดยใช้set()ซึ่งคุณไม่สามารถดำเนินการกับรายการที่ส่งคืนCollections.unmodifiableList()โดย หากคุณต้องการได้รับรายการเล็กๆ นี่เป็นวิธีที่ดีที่สุด แม้ว่าคอลเลกชั่นอื่นๆ จะโปร่งใสน้อยกว่าSetดังนั้นคุณจะต้องสร้างมันขึ้นมาListก่อนที่จะสร้างSet-a แต่ก็ยังดีกว่าการกำหนดค่าเริ่มต้นด้วยวงเล็บปีกกาคู่ เนื่องจากในกรณีนี้จะไม่มีการสร้างคลาสที่ไม่ระบุชื่อภายในเพิ่มเติมทุกครั้งที่ใช้งาน หากคุณใช้ Java 8 คุณจะมีวิธีอื่น JDK 8 Stream API จะช่วยคุณสร้างคอลเลกชั่นขนาดเล็กโดยการรวมStream Factoryวิธีการเอาท์พุตเข้ากับคอลเลกชั่นList:
List<String> list = Collections.unmodifiableList(Stream.of("abc", "bcd", "cde").collect(toList()));
สำหรับSetคุณสามารถใช้Collectors.toSet()วิธีการแทนCollectors.toList()ได้ดังนี้:
Set<String> set = Collections.unmodifiableSet(Stream.of("abc", "bcd", "cde").collect(toSet()));
อย่างไรก็ตามStream collectวิธีการไม่รับประกันว่าคอลเลกชันที่สร้างขึ้นจะได้รับการปกป้องจากการเปลี่ยนแปลง ใน Java 8 คอลเลกชันที่ส่งคืน (เช่น - ArrayList, HashSetและHashMap) ค่อนข้างธรรมดา (เราสามารถเปลี่ยนแปลงได้) แต่ข้อเท็จจริงนี้อาจได้รับการแก้ไขในการเปิดตัว JDK ในอนาคต ทั้งหมดตอนนี้เกี่ยวกับDouble braceการเริ่มต้นใน Java เทมเพลตนี้เป็นที่ยอมรับสำหรับการทดสอบและการสาธิต แต่ไม่ดีพอสำหรับการใช้งานจริง เนื่องจากข้อเสียโดยธรรมชาติ การเริ่มต้นวงเล็บปีกกาคู่จึงกลายเป็นรูปแบบที่ต่อต้านในปัจจุบัน โดยเฉพาะอย่างยิ่งเมื่อพิจารณาจากทางเลือกอื่นที่มีอยู่ ตัวฉันเองยังคงใช้โครงสร้างนี้เพื่อเริ่มต้นแผนที่แบบคงที่ ก็แค่นั้นแหละ เพราะListฉันชอบที่จะสร้างCollectionsโดยการรวมกับการสร้างArray.asListในตัวสร้างของมัน และถ้าฉันใช้ Java 8 - การออกแบบโดยใช้ Stream API และcollect(). บทความที่เกี่ยวข้อง:หากคุณชอบบทช่วยสอนนี้และต้องการเรียนรู้เพิ่มเติมเกี่ยวกับรูปแบบการเขียนโปรแกรม Java หลักการ และแนวทางปฏิบัติที่ดีที่สุด คุณอาจต้องการดูบทความอื่น ๆ บนเว็บไซต์ ของ เรา การอ่านที่แนะนำ:หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับรูปแบบและแนวทางปฏิบัติที่ดีที่สุด คุณควรอ่านEffective Programming โดย Joshua Blochไม่มีหนังสือเล่มใดมาแทนที่ได้ และหากคุณเชี่ยวชาญ Java อยู่แล้ว และกำลังมองหาหนังสือเกี่ยวกับรูปแบบการออกแบบ รูปแบบการนำเสนอที่ตลกขบขัน น่าสนใจ และอ่านง่าย ลองอ่านหัวข้อ“Head First” รูปแบบการออกแบบ" .
จากผู้แปล: ฉันจงใจให้ลิงก์ไปยังหนังสือต้นฉบับของ Bloch เนื่องจากการแปลเป็นภาษารัสเซียไม่ประสบความสำเร็จ (เช่น Builder = Constructor)
การแปลบทความDouble Brace Initialization ใน Java คืออะไร? ตัวอย่างรูปแบบการต่อต้าน (เผยแพร่เมื่อเดือนตุลาคม 2558)
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION