JavaRush /จาวาบล็อก /Random-TH /15 คำถามสัมภาษณ์นักพัฒนาเกี่ยวกับ Enum ใน Java (พร้อมคำตอ...
Treefeed
ระดับ

15 คำถามสัมภาษณ์นักพัฒนาเกี่ยวกับ Enum ใน Java (พร้อมคำตอบ!)

เผยแพร่ในกลุ่ม
การแจงนับ ( Enum ) เปิดตัวในJava 5และตั้งแต่นั้นมาก็ได้รับความนิยมอย่างมากในหมู่นักพัฒนา Java มีการใช้กันอย่างแพร่หลายในแอปพลิเคชัน Java ต่างๆ เนื่องจาก Enum ใน Java มีความหลากหลายมากกว่าใน C หรือ C++ มาก จึงมีกรณีการใช้งานที่น่าสนใจมากมาย ซึ่งบางกรณีที่คุณเห็นในบทความ10 วิธีในการใช้ Enum ใน Java แม้จะได้รับความนิยมเช่นนี้ แต่โปรแกรมเมอร์ Java จำนวนมากยังคงไม่ทราบถึงฟังก์ชันการทำงานของ Enum และความซับซ้อนของการใช้ Enum ในโค้ด Java สิ่งนี้ชัดเจนจากผู้อ่านหลายคนที่ถาม เช่น เกี่ยวกับ ความสามารถของ Enum ในการใช้อินเทอร์เฟซใน Javaหรือ เหตุใดเราจึงไม่สามารถยกตัวอย่าง Enum ภายนอก Enumโดยสังเกตว่าพวกเขาถูกถามเกี่ยวกับเรื่องนี้ในการสัมภาษณ์ สิ่งนี้เป็นแรงบันดาลใจให้เรารวบรวม รายการคำถามที่พบบ่อยใน Java Enumซึ่งไม่เพียงช่วยให้คุณประสบความสำเร็จในการสัมภาษณ์ แต่ยังเปิดช่องทางใหม่สำหรับการเรียนรู้อีกด้วย ตามที่ระบุไว้ก่อนหน้านี้ คำถามสัมภาษณ์มักจะบังคับให้คุณจริงจังกับหัวข้อนี้มากขึ้น ซึ่งไม่ใช่เรื่องเลวร้าย และเมื่อพิจารณาถึงพลังและประโยชน์ของ Enum ก็ถึงเวลาที่คุณจะต้องเป็นผู้เชี่ยวชาญ enum ด้านล่างนี้คือรายการคำถามตามฟังก์ชันและคุณสมบัติต่างๆ ของ Enum คุณสามารถใช้เป็นสื่อในการเตรียมการสัมภาษณ์หรือเป็นเพียงแนวทางในการแจงนับ หากคุณยังใหม่กับ Java คุณจะได้เรียนรู้สิ่งใหม่ ๆ และมีประโยชน์มากมายเกี่ยวกับ Enum 1) Enum สามารถใช้อินเทอร์เฟซใน Java ได้หรือไม่ ใช่ Enum สามารถสืบทอดอินเทอร์เฟซได้ เนื่องจากประเภท Enum คล้ายกับ คลาสและ interfaceจึงสามารถสืบทอดอินเทอร์เฟซได้ สิ่งนี้ให้ความยืดหยุ่นที่น่าทึ่งในการใช้ Enum เป็นการใช้งานแบบกำหนดเองในบางกรณี นี่เป็นตัวอย่างที่ดีของการใช้ Enum ในด้านนี้ 2) Enum สามารถสืบทอด (ขยาย) คลาสได้หรือไม่ ไม่เขาไม่สามารถ! ไม่คาดคิด เนื่องจากก่อนหน้านี้กล่าวไว้ว่าประเภท Enum คล้ายกับคลาสหรืออินเทอร์เฟซใน Java นี่คือเหตุผลหลักว่าทำไมคำถามนี้จึงถูกถามหลังจากคำถามก่อนหน้า เนื่องจาก Enum สืบทอดมาจากคลาสนามธรรม java.lang.Enum อยู่แล้ว จึงเป็นที่ชัดเจนว่าคลาสอื่นจะไม่สามารถสืบทอดได้เนื่องจาก Java ไม่รองรับการสืบทอดหลายคลาส โดยการสืบทอดจาก java.lang.Enum enum ทั้งหมดจะมีเมธอด ordinal() , value()หรือ valueOf( ) 3) จะสร้าง Enum โดยไม่มีอินสแตนซ์ของวัตถุได้อย่างไร เป็นไปได้ไหมโดยไม่มีข้อผิดพลาดในการรวบรวม? นี่เป็นหนึ่งใน คำถามยุ่งยากที่ผู้สัมภาษณ์ชอบ เนื่องจาก Enum ถูกมองว่าเป็นกลุ่มของวัตถุจำนวนหนึ่ง เช่น วันในสัปดาห์หรือ เดือนของปีการได้รับ Enum โดยไม่มีสิ่งใดเลยจึงดูน่าสงสัย แต่ใช่ คุณ สามารถสร้าง Enum โดยไม่มีอินสแตนซ์ได้ เช่น โดยการสร้างคลาสยูทิลิตี้ นี่เป็นอีกวิธีใหม่ในการใช้ Enum: public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } } 4) เราสามารถแทนที่วิธี toString() สำหรับ Enum ได้หรือไม่? จะเกิดอะไรขึ้นถ้าเราไม่แทนที่? แน่นอนคุณสามารถแทนที่ toString() เมธอดของ Enum ได้ เนื่องจากคุณสามารถแทนที่คลาสใดๆ ที่สืบทอด java.lang.Objectและมี เมธอด toString()พร้อมใช้งาน และแม้ว่าคุณจะไม่ทำ คุณก็จะไม่สูญเสียอะไรเลยเพราะนามธรรม ฐานของคลาส Enum จะทำสิ่งนี้ให้คุณ และจะส่งคืนชื่อซึ่งเป็นชื่อของอินสแตนซ์ Enum นี่คือโค้ดสำหรับ เมธอด toString()จากคลาส Enum: public String toString() { return name; } ชื่อ ถูกระบุเมื่อคอมไพลเลอร์จัดสรรโค้ดเพื่อสร้าง enum เพื่อตอบสนองต่อการสร้างอินสแตนซ์ในคลาส Enum เอง เช่นเดียวกับการสร้างลำดับในตัวสร้างจาก คลาส java.lang.Enum : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } นี่เป็น Constructor เดียวสำหรับการสร้าง enumซึ่งคอมไพลเลอร์เรียกเพื่อตอบสนองต่อการประกาศ Enum ในโปรแกรม 5) เราสามารถยกตัวอย่าง Enum นอก Enum ได้หรือไม่? ทำไมจะไม่ล่ะ? คุณ ไม่สามารถยกตัวอย่าง Enum นอกขอบเขตของ Enum ได้เนื่องจาก Enum ไม่มี สาธารณะConstructor และคอมไพลเลอร์จะไม่อนุญาตให้คุณแนะนำ Constructor ดังกล่าว เนื่องจากคอมไพลเลอร์สร้างโค้ดส่วนใหญ่เพื่อตอบสนองต่อการประกาศประเภท Enum จึงไม่อนุญาตให้ ใช้ตัวสร้าง สาธารณะภายใน Enums บังคับให้อินสแตนซ์ Enum ต้องประกาศภายใน 6) เราสามารถระบุตัวสร้างภายใน Enum ได้หรือไม่? คำถามนี้มักจะเป็นไปตามคำถามก่อนหน้า ใช่ คุณสามารถทำได้ แต่จำไว้ว่าสิ่งนี้เป็นไปได้เฉพาะกับตัวสร้าง ส่วนตัวหรือ ตัวสร้าง แพ็คเกจ เท่านั้น ไม่อนุญาตให้ใช้ตัวสร้างที่ มีสาธารณะและ ได้รับการคุ้มครอง ใน Enum ที่นี่คุณ สามารถดู ตัวอย่าง 7) อะไรคือความแตกต่างระหว่างการเปรียบเทียบ Enum โดยใช้วิธี == หรือเท่ากับ () นี่เป็นปัญหาที่กว้างและยุ่งยากมากซึ่งมีการกล่าวถึงโดยละเอียดที่ นี่ 8) วิธีลำดับ () ทำอะไรใน Enum? ordinal() วิธีการส่งกลับลำดับที่อินสแตนซ์ Enum ถูกกำหนดไว้ภายใน Enum ตัวอย่างเช่น ใน DayOfWeek Enum คุณสามารถระบุวันตามลำดับได้ public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } และหากเราเรียก เมธอด DayOfWeek.MONDAY.ordinal()ก็จะคืนค่า 0 ซึ่งหมายถึงอินสแตนซ์แรก วิธีนี้มีประโยชน์มากในการจัดทำคำสั่งซื้อตามสถานะที่แท้จริงของสิ่งต่าง ๆ กล่าวคือ วันอังคาร (วันอังคาร) มาถึงหลังจาก วันจันทร์ (วันจันทร์) และก่อน วันพุธ (วันพุธ) ในทำนองเดียวกัน คุณสามารถใช้การแจงนับเพื่อแสดงเดือนต่างๆ ของปี โดยที่เดือนกุมภาพันธ์มาหลังเดือนมกราคมแต่มาก่อนเดือนมีนาคม การแจงนับแบบกำหนดเองทั้งหมดสืบทอดวิธีการนี้จากคลาสนามธรรม java.lang.Enumและถูกกำหนดโดยคอมไพเลอร์โดยการเรียก ตัวสร้าง ที่ได้รับการป้องกันบน java.lang.Enumซึ่งใช้ชื่อและลำดับ 9) เป็นไปได้ไหมที่จะใช้ Enum กับ TreeSet หรือ TreeMap ใน Java? นี่เป็นคำถาม Enum ที่น่าสนใจมากและเป็นคำถามที่ผู้คนชอบถามเพื่อทดสอบความรู้เชิงลึกของตนเอง จนกว่าคุณจะดู โค้ด java.lang.Enumคุณอาจไม่ทราบว่า Enum สืบทอดส่วนต่อประสานที่เปรียบเทียบได้ซึ่งเป็นข้อกำหนดสำคัญสำหรับใช้ในคอลเลกชันที่เรียงลำดับ เช่น TreeSetและ TreeMap เนื่องจาก Enum สืบทอดอินเทอร์เฟซ ที่เปรียบเทียบได้ตามค่าเริ่มต้นจึงสามารถใช้กับ TreeSetและ TreeMapได้ 10) ความแตกต่างระหว่างลำดับ () และ CompareTo () ใน Enum คืออะไร? สิ่งนี้ต่อจากคำถามก่อนหน้าโดยตรง: อันที่จริง CompareTo()จำลองลำดับที่ระบุโดยเมธอด ordinal()ซึ่งเป็นลำดับธรรมชาติของ Enum กล่าวโดยสรุป Enum จำกัดการเปรียบเทียบตามลำดับที่ประกาศ นอกจากนี้ ควรจำไว้ว่าค่าคงที่เหล่านี้เทียบได้เฉพาะกับค่าคงที่อื่นๆ ที่เป็นประเภทเดียวกันเท่านั้น การเปรียบเทียบค่าคงที่ประเภทต่างๆ อาจทำให้เกิดข้อผิดพลาดของคอมไพเลอร์ได้ 11) เป็นไปได้ไหมที่จะใช้ Enum ในกรณีสวิตช์? ใช่คุณสามารถ. นอกจากนี้ นี่ยังเป็นหนึ่งในประโยชน์หลักของการใช้ Enum เนื่องจากอินสแตนซ์ Enum คอมไพล์เป็นค่าคงที่ชั่วคราว คุณจึงสามารถแทรกอินสแตนซ์เหล่านั้นไว้ภายใน เคสและสลับได้ อย่างปลอดภัย นี่คือตัวอย่างโค้ดที่มีวันในสัปดาห์: public void developerState(DayOfWeek today){ switch(today){ case MONDAY: System.out.println("Hmmmmmmmm"); break; case TUESDAY: System.out.println("Hmmmm"); break; case FRIDAY : System.out.println("Yeahhhhhh"); break; } } Enum และ Switch เข้ากันได้ดี โดยเฉพาะอย่างยิ่งถ้า Enum มีค่าคงที่คงที่จำนวนเล็กน้อย เช่น 7 วันในสัปดาห์ 12 เดือนในหนึ่งปี เป็นต้น ดูที่ ตัวอย่างอื่น ๆ ของการใช้ swith caseกับ Enum 12) จะวนซ้ำอินสแตนซ์ Enum ทั้งหมดได้อย่างไร หากคุณเปิด java.lang.Enumคุณจะรู้ว่า เมธอด values()ส่งคืนอาร์เรย์ของค่าคงที่ Enum ทั้งหมด เนื่องจากทุก enum สืบทอด java.lang.Enumจึงมี เมธอด Values( ) เมื่อใช้มัน คุณสามารถวนซ้ำค่าคงที่ของการแจงนับประเภทใดประเภทหนึ่งได้ ดู ตัวอย่างการดำเนินการนี้ด้วย การวนซ้ำ foreachและเมธอด values( ) 13) ข้อดีและข้อเสียของการใช้ Enum เป็นซิงเกิลตันคืออะไร Enum จัดเตรียม ทางลัดด่วนสำหรับการนำรูปแบบซิงเกิลตันไปใช้ และเนื่องจากรูปแบบดังกล่าวได้กล่าวถึงในหนังสือ Effective Java ด้วย จึงเป็นตัวเลือกยอดนิยม เมื่อมองแวบแรก Enum singleton มีแนวโน้มดีและค่อนข้างสะดวก เช่น ควบคุมการสร้างอินสแตนซ์ สามารถซีเรียลไลซ์ได้อย่างปลอดภัย และเหนือสิ่งอื่นใด การสร้างซิงเกิลตันที่ปลอดภัยสำหรับเธรดโดยใช้ Enum เป็นเรื่องง่าย คุณไม่จำเป็นต้องกังวลเกี่ยวกับการตรวจสอบความผันผวนของตัวแปรซ้ำแล้วซ้ำอีก อ่านเพิ่มเติมเกี่ยวกับข้อดีข้อเสียของการใช้วิธีการนี้ ที่นี่ 14) การใช้ Enum แทนที่จะใช้รูปแบบการแจงนับ int และรูปแบบการแจงนับ String มีประโยชน์อย่างไร หากคุณเขียนโปรแกรมมานานกว่า 5 ปีและยังอยู่ใน JDK 1.3 หรือ 1.4 คุณจะคุ้นเคยกับ รูปแบบการแจงนับ String และ intซึ่งใช้ คำนำหน้า ค่าคงที่สุดท้ายแบบคงที่สาธารณะเพื่อแสดงคอลเลกชันของรูปแบบคงที่ที่รู้จักกันดี หลายๆ อย่าง เช่นวัน ในสัปดาห์ มีปัญหามากมายที่นี่: คุณไม่มีความเป็นอิสระของประเภท Enum เนื่องจาก ตัวแปร Stringที่รับผิดชอบในวันในสัปดาห์สามารถรับค่าที่กำหนดเองได้ ในทำนองเดียวกัน int ที่นับได้ สามารถรับค่าใดๆ ก็ได้ และคอมไพเลอร์ก็จะกลืนมันลงไปอย่างมีความสุข และใช้ Enumคุณจะได้รับประเภทความปลอดภัยที่คอมไพเลอร์ตรวจสอบให้คุณ มีแนวคิดที่น่าสนใจบางประการในหัวข้อนี้ใน Effective Java ซึ่งแนะนำให้อ่านสำหรับนักพัฒนา Java ทุกคน 15) วิธีแปลง String เป็น Enum นี่เป็นคำถามประจำวันที่เกิดขึ้นเนื่องจากความนิยมในการใช้ Stringและ Enumในการพัฒนาแอปพลิเคชัน Java วิธีที่ดีที่สุดในการแปลง Enum เป็น Stringคือการกำหนดวิธีการจากโรงงานบน Enum เองที่จะรับ อาร์กิวเมนต์ Stringและส่งคืนเป็น Enum คุณอาจต้องการละเว้นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ต่อไปนี้คือ ตัวอย่าง บางส่วน ของการเปลี่ยนสตริงเป็นการแจงนับ นี่นำเรามาถึงจุดสิ้นสุดของรายการคำถาม 15 ข้อ ( และคำตอบ ) เกี่ยวกับ Enum แต่จำไว้ว่า: การอ่านไม่เพียงพอที่จะเรียนรู้ มันเป็นเพียงก้าวแรกเท่านั้น เพื่อให้ได้ประโยชน์จาก enums ลองค้นหาว่าคุณสามารถใช้ Enum ในโครงการของคุณได้ที่ไหน ซึ่งจะทำให้คุณได้รับประสบการณ์จริง และด้วยประสบการณ์นี้ คุณจะได้เรียนรู้มากกว่าจากตัวอย่าง เนื่องจากคุณจะพบกับปัญหาต่างๆ ที่คุณสามารถจัดการได้มากขึ้น วิธีการที่ซับซ้อนและละเอียด ข้อกำหนด คำถาม เหล่านี้ เกี่ยวกับ Enumควรค่าแก่การใส่ใจเพื่อทดสอบความรู้ของคุณ โดยเฉพาะอย่างยิ่งหากคุณรีบสัมภาษณ์และไม่มีเวลาสำหรับการดำดิ่งลงไปในจักรวาล Enum แบบละเอียด
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION