JavaRush /Java Blog /Random-TW /關於 Java 中 Enum 的 15 個開發人員面試問題(附答案!)
Treefeed
等級 21

關於 Java 中 Enum 的 15 個開發人員面試問題(附答案!)

在 Random-TW 群組發布
枚舉 ( Enum ) 是在Java 5中引入的,從那時起它在 Java 開發人員中變得非常流行。它廣泛應用於各種Java應用程式。由於 Java 中的 Enum 比 C 或 C++ 中的通用性更強,因此它還提供了許多有趣的用例,您可以在文章《在Java 中使用 Enum 的 10 種方法》中看到其中的一些用例。但儘管如此受歡迎,許多 Java 程式設計師仍然不知道 Enum 提供的功能以及在 Java 程式碼中使用 Enum 的複雜性。 一些讀者詢問了這一點,例如 Enum 在 Java 中實現介面的能力,或者 為什麼我們不能在 Enum 之外實例化 Enum,並指出他們在訪談中被問到了這一點。這啟發我們整理了 Java Enum 中的常見問題列表,不僅可以幫助您在面試中取得成功,還可以開闢新的學習途徑。如前所述,面試問題通常會迫使您更認真地對待該主題,這並不是一件壞事,並且考慮到 Enum 的強大功能和實用性,是時候成為枚舉大師了。以下是基於枚舉的各種功能和屬性的問題清單。您可以將其用作面試的準備材料或僅用作枚舉指南。如果您是 Java 新手,您將學到很多關於 Enum 的新的有用的東西。 1)Enum可以實作Java中的介面嗎? 是的, Enum可以繼承介面。因為Enum類型類似 類別接口,所以它可以繼承接口。在某些情況下,這為使用 Enum 作為自訂實作提供了驚人的靈活性。 下面是使用 Enum 實現此功能的一個很好的範例。 2)Enum可以繼承(擴展)類別嗎? 不他不能!出乎意料,因為之前說過Enum型別類似Java中的類別或介面。嗯,這就是為什麼這個問題是在上一個問題之後提出的主要原因。由於 Enum 已經繼承自抽象類別 java.lang.Enum,很明顯,另一個類別將無法繼承,因為 Java 不支援多類別繼承。透過繼承 java.lang.Enum,所有枚舉都具有 ordinal()values()valueOf()方法。 3)如何建立沒有物件實例的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) 我們可以重寫 Enum 的 toString() 方法嗎?如果我們不覆蓋會發生什麼? 當然,您可以重寫Enum 的 toString()方法 ,因為您可以重寫任何繼承 java.lang.Object並具有可用 toString()方法的類,即使您不這樣做,您也不會丟失任何內容,因為抽象Enum 類別的基底類別將為您執行此操作,並將傳回名稱,即 Enum 實例的名稱。以下是Enum 類別中 toString()方法的程式碼: 當編譯器指派程式碼來建立枚舉以回應在 Enum 類別本身中建立實例以及在建構函式中建立序數時,指定 public String toString() { return name; } name java.lang.Enum class : protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; } 這是 創建enum 的唯一建構函數,由編譯器呼叫以回應程式中 Enum 的宣告。 5)我們可以在 Enum 之外實例化 Enum 嗎?為什麼不?無法在 Enum 範圍之外實例化 Enum,因為 Enum 沒有 public構造函數,編譯器將不允許您引入任何此類構造函數。由於編譯器產生大多數程式碼來回應 Enum 類型聲明,因此它不允許Enum 中存在 公共建構函數,從而強制在內部聲明 Enum 實例。 6) 我們可以在 Enum 中指定建構函式嗎? 這個問題通常緊接著上一個問題。是的,可以,但請記住,這只能透過 私有包私有建構函來實現。Enum 中不允許使用 publicprotected建構子。在這裡你可以看到 一個例子。 7) 使用 == 或 equals() 方法比較 Enum 有何不同? 這是一個非常廣泛且棘手的問題,這裡 將詳細介紹。 8)ordinal()方法在Enum中做什麼? ordinal() 方法傳回 Enum 實例在 Enum 中指定的順序。例如,在 DayOfWeek枚舉中,您可以依序指定日期: public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } 如果我們呼叫 DayOfWeek.MONDAY.ordinal()方法,它將傳回 0 - 這表示第一個實例。此方法對於根據事物的實際狀態提供順序非常有用:即表明 TUESDAY(星期二)在 MONDAY(星期一)之後, WEDNESDAY(星期三)之前。同樣,您可以使用枚舉來表示一年中的月份,其中二月在一月之後但在三月之前。所有自訂枚舉都從抽象類別 java.lang.Enum繼承此方法,並且它們由編譯器透過呼叫 java.lang.Enum上的 受保護建構函數來設置,該構造函數採用名稱和序數。 9) 在Java中是否可以將Enum與TreeSet或TreeMap一起使用? 這是一個非常有趣的枚舉問題,人們喜歡問這個問題來測試他們的知識深度。在查看 java.lang.Enum程式碼之前,您可能不會知道 Enum 繼承了 Comparable 接口,這是在 TreeSetTreeMap等有序集合中使用的關鍵要求。由於Enum預設繼承 Comparable接口,因此它可以與 TreeSetTreeMap一起使用。 10) Enum 中的ordinal() 和compareTo() 有什麼不同? 這直接來自上一個問題:事實上, compareTo()模擬了該方法提供的順序 ordinal(),這是 Enum 的自然順序。簡而言之,Enum 按照宣告的順序限制比較。另外,值得記住的是,這些常數只能與相同類型的其他常數進行比較 - 比較不同類型的常數可能會導致編譯器錯誤。 11)是否可以在 switch case 中使用 Enum? 是的你可以。此外,這是使用 Enum 的主要好處之一。由於 Enum 實例編譯為臨時常數,因此您可以安全地將它們注入 case 和 switch內。以下是一個包含星期幾的程式碼範例: 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,您就會知道 value()方法傳回所有 Enum 常數的陣列。由於每個枚舉都繼承 java.lang.Enum,因此它們都有一個 value()方法。使用它,您可以迭代特定類型的枚舉的所有常數。查看使用 foreach循環和 value()方法進行此操作的 範例13)使用Enum作為單例有何優點和缺點? Enum 提供了實現單例模式的 快速快捷方式,而且因為Effective Java 書中甚至介紹了它,所以它是一個流行的選擇。乍一看,Enum 單例很有前途,而且相當方便,例如它控制實例化,可以安全地序列化,最重要的是,使用 Enum 可以輕鬆創建線程安全的單例。您不再需要擔心雙重檢查變數的波動性。 在此詳細了解使用此方法的優點和缺點。 14) 使用 Enum 取代 int 枚舉和 String 枚舉模式有什麼好處? 如果您已經編程超過 5 年並且仍在使用 JDK 1.3 或 1.4,您將熟悉 String 和 int 枚舉模式,它們使用 public static final常數前綴來表示眾所周知的固定值的集合許多事情,例如 一周中的幾天。這裡有很多問題:您沒有 Enum 類型的獨立性,因為負責星期幾的 String變數可以採用任何任意值。同樣,可枚舉 int可以採用任何值,編譯器會很樂意吞下它。並使用 Enum,您可以獲得編譯器為您檢查的類型安全性。《Effective Java》中對此主題有一些有趣的想法,建議所有 Java 開發人員閱讀。 15) 如何將字串轉換為枚舉?由於在 Java 應用程式開發中使用 StringEnum 的流行,這是一個日常問題。 將Enum 轉換為 String 的最佳方法是在 Enum 本身上定義一個工廠方法,該方法將採用 String參數並將其作為 Enum傳回。您可能也希望忽略大小寫。以下是一些將字串轉換為枚舉的 範例。 關於 Enum 的 15 個問題(和答案)到此結束。 但請記住: 閱讀不足以學習,它只是第一步。為了從枚舉中受益,請嘗試在項目中找到可以使用枚舉的位置- 這將為您提供真實的經驗,並且通過這種經驗,您將學到比示例更多的知識,因為您將遇到更多可以在更多情況下處理的問題複雜而詳細的方式、要求。這些 關於 Enum 的問題值得關注,以測試您的知識,特別是如果您急於參加面試並且根本沒有時間詳細沉浸在 Enum 世界中。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION