JavaRush /Blog Java /Random-VI /15 câu hỏi phỏng vấn nhà phát triển về Enum trong Java (c...
Treefeed
Mức độ

15 câu hỏi phỏng vấn nhà phát triển về Enum trong Java (có câu trả lời!)

Xuất bản trong nhóm
Enumeration ( Enum ) đã được giới thiệu trong Java 5 và kể từ đó nó trở nên khá phổ biến đối với các nhà phát triển Java. Nó được sử dụng rộng rãi trong các ứng dụng Java khác nhau. Vì Enum trong Java linh hoạt hơn nhiều so với trong C hoặc C++ nên nó cũng trình bày nhiều trường hợp sử dụng thú vị, một số trường hợp bạn đã thấy trong bài viết 10 cách sử dụng Enum trong Java . Nhưng bất chấp sự phổ biến này, nhiều lập trình viên Java vẫn không biết về chức năng do Enum cung cấp cũng như sự phức tạp của việc sử dụng Enum trong mã Java. Điều này trở nên rõ ràng khi một số độc giả hỏi, chẳng hạn như về khả năng của Enum trong việc triển khai giao diện trong Java hoặc Tại sao chúng ta không thể khởi tạo Enums bên ngoài Enum , lưu ý rằng họ đã được hỏi về điều này trong một cuộc phỏng vấn. Điều này đã truyền cảm hứng cho chúng tôi biên soạn danh sách các câu hỏi thường gặp trong Java Enum. Danh sách này không chỉ giúp bạn thành công trong các cuộc phỏng vấn mà còn mở ra những con đường học tập mới. Như đã nêu trước đây, các câu hỏi phỏng vấn thường buộc bạn phải xem chủ đề một cách nghiêm túc hơn, đây không phải là điều xấu và với sức mạnh cũng như sự hữu ích của Enum, đã đến lúc bạn trở thành bậc thầy về enum. Dưới đây là danh sách các câu hỏi dựa trên chức năng và thuộc tính khác nhau của Enum. Bạn có thể sử dụng nó làm tài liệu chuẩn bị cho một cuộc phỏng vấn hoặc chỉ là một hướng dẫn để liệt kê. Nếu mới làm quen với Java, bạn sẽ học được rất nhiều điều mới mẻ và hữu ích về Enum. 1) Enum có thể triển khai giao diện trong Java không? Có, Enum có thể kế thừa các giao diện . Vì kiểu Enum giống với một lớpmột giao diện nên nó có thể kế thừa một giao diện. Điều này mang lại sự linh hoạt đáng kinh ngạc khi sử dụng Enum làm triển khai tùy chỉnh trong một số trường hợp. Đây là một ví dụ điển hình về việc sử dụng Enum trong khả năng này. 2) Enum có thể kế thừa (mở rộng) lớp không? Không, anh ấy không thể! Thật bất ngờ, vì trước đây người ta nói rằng kiểu Enum giống với một lớp hoặc giao diện trong Java. Chà, đây là lý do chính tại sao câu hỏi này được hỏi ngay sau câu hỏi trước. Vì Enum đã kế thừa từ lớp trừu tượng java.lang.Enum , nên rõ ràng là một lớp khác sẽ không thể kế thừa vì Java không hỗ trợ kế thừa nhiều lớp. Bằng cách kế thừa từ java.lang.Enum , tất cả các enum đều có các phương thức ordinal() , value() hoặc valueOf() . 3) Làm cách nào để tạo Enum không có phiên bản đối tượng? Điều này có thể thực hiện được mà không có lỗi biên dịch không? Đây là một trong những câu hỏi khó mà người phỏng vấn yêu thích. Vì Enum được coi là tập hợp của một số đối tượng nhất định, chẳng hạn như các ngày trong tuần hoặc các tháng trong năm, nên việc nhận được Enum mà không có bất kỳ điều gì có vẻ đáng ngờ. Nhưng có, bạn có thể tạo Enum mà không cần có phiên bản , chẳng hạn bằng cách tạo một lớp tiện ích. Đây là một cách sáng tạo khác để sử dụng Enum: public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } } 4) Chúng ta có thể ghi đè phương thức toString() cho Enum không? Điều gì xảy ra nếu chúng ta không xác định lại? Tất nhiên, bạn có thể ghi đè phương thức toString() của Enum , vì bạn có thể ghi đè bất kỳ lớp nào kế thừa java.lang.Object và có sẵn phương thức toString() , và ngay cả khi không làm như vậy, bạn sẽ không mất gì vì tính trừu tượng base của lớp Enum sẽ thực hiện việc này cho bạn và sẽ trả về tên, là tên của thể hiện Enum. Đây là mã cho phương thức toString() từ lớp Enum: public String toString() { return name; } tên được chỉ định khi trình biên dịch phân bổ mã để tạo một enum nhằm phản hồi lại việc tạo một thể hiện trong chính lớp Enum, cũng như tạo một thứ tự trong hàm tạo từ Lớp java.lang.Enum : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } Đây là hàm tạo duy nhất để tạo enum , được trình biên dịch gọi để đáp lại việc khai báo Enum trong chương trình. 5) Chúng ta có thể khởi tạo một Enum bên ngoài Enum không? Tại sao không? Bạn không thể khởi tạo Enum bên ngoài giới hạn của Enum vì Enum không có publichàm tạo và trình biên dịch sẽ không cho phép bạn giới thiệu bất kỳ hàm tạo nào như vậy. Bởi vì trình biên dịch tạo ra hầu hết mã để phản hồi việc khai báo kiểu Enum, nên nó không cho phép các hàm tạo công khai trong Enums, buộc các phiên bản Enum phải được khai báo nội bộ. 6) Chúng ta có thể chỉ định một hàm tạo bên trong Enum không? Câu hỏi này thường theo sau câu hỏi trước. Có, bạn có thể, nhưng hãy nhớ rằng điều này chỉ có thể thực hiện được với các hàm tạo riêng tư hoặc gói riêng tư . Các nhà xây dựng có công khaiđược bảo vệ không được phép sử dụng Enum. Ở đây bạn có thể xem một ví dụ. 7) Sự khác biệt giữa việc so sánh Enum bằng phương thức == hoặc bằng () là gì? Đây là một vấn đề rất rộng và phức tạp được đề cập chi tiết ở đây . 8) Phương thức ordinal() trong Enum làm gì? Phương thức ordinal() trả về thứ tự các phiên bản Enum được chỉ định trong Enum. Ví dụ: trong DayOfWeek Enum, bạn có thể chỉ định các ngày theo thứ tự: public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } và nếu chúng ta gọi phương thức DayOfWeek.MONDAY.rdinal() thì nó sẽ trả về 0 - nghĩa là phiên bản đầu tiên. Phương pháp này rất hữu ích trong việc cung cấp thứ tự theo trạng thái thực tế của sự vật: nghĩa là chỉ ra rằng THỨ BA (Thứ Ba) đến sau THỨ HAI (Thứ Hai) và trước THỨ TƯ (Thứ Tư). Tương tự, bạn có thể sử dụng bảng liệt kê để biểu thị các tháng trong năm, trong đó tháng 2 đến sau tháng 1 nhưng trước tháng 3. Tất cả các bảng liệt kê tùy chỉnh đều kế thừa phương thức này từ lớp trừu tượng java.lang.Enum và chúng được trình biên dịch thiết lập bằng cách gọi hàm tạo được bảo vệ trên java.lang.Enum , hàm tạo này có tên và thứ tự. 9) Có thể sử dụng Enum với TreeSet hoặc TreeMap trong Java không? Đây là một câu hỏi Enum thực sự thú vị và là câu hỏi mà mọi người muốn hỏi để kiểm tra kiến ​​thức chuyên sâu của họ. Cho đến khi bạn nhìn vào mã java.lang.Enum , có thể bạn sẽ không biết rằng Enum kế thừa giao diện Comparable , đây là yêu cầu chính để sử dụng trong các bộ sưu tập có thứ tự như TreeSetTreeMap . Vì Enum kế thừa giao diện Comparable theo mặc định nên nó có thể được sử dụng với TreeSetTreeMap . 10) Sự khác biệt giữa ordinal() và so sánhTo() trong Enum là gì? Điều này diễn ra trực tiếp từ câu hỏi trước: trên thực tế, so sánhTo() mô phỏng thứ tự được cung cấp bởi phương thức ordinal() , đó là thứ tự tự nhiên của Enum. Nói tóm lại, Enum hạn chế so sánh theo thứ tự chúng được khai báo. Ngoài ra, cần nhớ rằng các hằng số này chỉ có thể so sánh được với các hằng số khác cùng loại - việc so sánh các loại hằng số khác nhau có thể dẫn đến lỗi trình biên dịch. 11) Có thể sử dụng Enum trong trường hợp switch không? Vâng, bạn có thể. Hơn nữa, đây là một trong những lợi ích chính của việc sử dụng Enum. Vì các phiên bản Enum biên dịch thành một hằng số tạm thời nên bạn có thể đưa chúng vào bên trong case và switch một cách an toàn . Đây là một ví dụ về mã với các ngày trong tuần: 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 và Switch bổ sung tốt cho nhau, đặc biệt nếu Enum chứa một số lượng nhỏ các hằng số ổn định, ví dụ: bảy ngày trong tuần, 12 tháng trong năm, v.v. Hãy xem các ví dụ khác về cách sử dụng chữ hoa chữ thường với Enum . 12) Làm cách nào để lặp qua toàn bộ phiên bản Enum? Nếu bạn đã mở java.lang.Enum , bạn sẽ biết rằng phương thức value() trả về một mảng gồm tất cả các hằng số Enum. Vì mọi enum đều kế thừa java.lang.Enum nên chúng có phương thức value() . Bằng cách sử dụng nó, bạn có thể lặp qua tất cả các hằng số của một kiểu liệt kê nhất định. Hãy xem các ví dụ về việc này được thực hiện bằng vòng lặp foreach và phương thức value() . 13) Ưu và nhược điểm của việc sử dụng Enum như một singleton là gì? Enum cung cấp một lối tắt nhanh để triển khai mẫu đơn và vì nó thậm chí còn được đề cập trong sách Java hiệu quả nên đây là một lựa chọn phổ biến. Thoạt nhìn, Enum singleton đầy hứa hẹn và khá tiện lợi, chẳng hạn như nó kiểm soát quá trình khởi tạo, có thể tuần tự hóa một cách an toàn và trên hết, có thể dễ dàng tạo một singleton an toàn theo luồng bằng Enum. Bạn không còn cần phải lo lắng về việc kiểm tra lại độ biến động của các biến số. Đọc thêm về ưu và nhược điểm của việc sử dụng phương pháp này tại đây . 14) Lợi ích của việc sử dụng Enum thay vì kiểu liệt kê int và kiểu liệt kê String là gì? Nếu bạn đã lập trình hơn 5 năm và vẫn sử dụng JDK 1.3 hoặc 1.4, thì bạn sẽ quen với các mẫu liệt kê String và int , sử dụng tiền tố hằng số public static cuối cùng để biểu thị một tập hợp các cố định nổi tiếng. số thứ, chẳng hạn như Ngày trong tuần . Có nhiều vấn đề ở đây: bạn không có sự độc lập với loại Enum, vì biến Chuỗi chịu trách nhiệm về ngày trong tuần có thể nhận bất kỳ giá trị tùy ý nào. Tương tự như vậy, một int đếm được có thể nhận bất kỳ giá trị nào và trình biên dịch sẽ vui vẻ nuốt nó. Và sử dụng Enum , bạn sẽ có được độ an toàn về loại mà trình biên dịch sẽ kiểm tra cho bạn. Có một số suy nghĩ thú vị về chủ đề này trong cuốn sách Java hiệu quả, được khuyến khích đọc dành cho tất cả các nhà phát triển Java. 15) Làm thế nào để chuyển đổi Chuỗi thành Enum? Đây là câu hỏi được đặt ra hàng ngày do sự phổ biến của việc sử dụng StringEnum trong phát triển ứng dụng Java. Cách tốt nhất để chuyển đổi Enum thành String là xác định một phương thức xuất xưởng trên chính Enum sẽ lấy các đối số String và trả về dưới dạng Enum . Bạn cũng có thể muốn bỏ qua trường hợp. Dưới đây là một số ví dụ về việc chuyển chuỗi thành bảng liệt kê. Điều này đưa chúng ta đến cuối danh sách 15 câu hỏi ( và câu trả lời ) về Enum. Nhưng hãy nhớ: đọc thôi chưa đủ để học, nó chỉ là bước đầu tiên mà thôi . Để hưởng lợi từ enum, hãy cố gắng tìm nơi bạn có thể sử dụng Enum trong dự án của mình - điều này sẽ mang lại cho bạn trải nghiệm thực tế và với trải nghiệm này, bạn sẽ học được nhiều điều hơn là từ các ví dụ, vì bạn sẽ gặp nhiều vấn đề hơn mà bạn có thể xử lý nhiều hơn những cách phức tạp và chi tiết. Những câu hỏi này về Enum rất đáng được chú ý để kiểm tra kiến ​​​​thức của bạn, đặc biệt nếu bạn đang vội phỏng vấn và đơn giản là không có thời gian để tìm hiểu chi tiết về vũ trụ Enum.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION