<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Java 枚舉(`enum`) > 原文: [https://javabeginnerstutorial.com/core-java-tutorial/java-enum-enumerations/](https://javabeginnerstutorial.com/core-java-tutorial/java-enum-enumerations/) 在本文中,我將介紹 Java 枚舉,這是在應用中定義和使用常量的最優雅的方式。 這是每個人都知道的基本功能,但還有一些您可能不知道的功能。 ## 為什么要使用枚舉? 好吧,您在 Java 代碼中使用了枚舉。 如果您不這樣做,那么您做錯了什么,或者擁有非常簡單的應用而沒有太多復雜功能。 無論如何,讓我們看一下基礎知識。 例如,您想要一個使用工作日的類。 您可以這樣定義它: ```java public class Schedule { private ??? workday; } ``` 要存儲工作日,我們創建一個工具類來存儲工作日的常量: ```java public class Workdays { public static final String MONDAY = "Monday"; public static final String TUESDAY = "Tuesday"; public static final String WEDNESDAY = "Wednesday"; public static final String THURSDAY = "Thursday"; public static final String FRIDAY = "Friday"; } ``` 現在,`Schedule`類將如下所示: ```java public class Schedule { // Workdays.MONDAY, Workdays.TUESDAY // Workdays.WEDNESDAY, Workdays.THURSDAY // Workdays.FRIDAY private String workday; } ``` 我想您已經看到了這種方法的缺點:即使`Workdays`類中未定義工作日,也可以輕松地將工作日設置為“星期六”或“星期日”。 此解決方案不是值安全的。 這不是我們想要實現的。 為了解決這個問題,我們將`Workdays`類轉換為一個枚舉: ```java public enum Workday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY } ``` 所需的打字次數更少,現在該解決方案是值安全的。 我們只需要調整`Schredule`類: ```java public class Schedule { private Workday workday; public Workday getWorkday() { return this.workday; } public void setWorkday(Workday workday) { this.workday = workday; } } ``` ## 條件和枚舉 枚舉非常適合條件表達式(`if`語句或`switch`塊)。 關于枚舉的好處是它們是常量值,因此您可以將它們與`==`運算符進行比較,該運算符比使用`equals()`更優雅-并且避免了可能的`NullPointerExceptions`。 順便說一句:如果您查看`Enum`類`equals()`的實現,您將看到以下內容: ```java public final boolean equals(Object other) { return this==other; } ``` 因此,請自由使用`==`,因為這是`equals()`的默認實現。 讓我們看一下如何使用它們的示例: ```java if(currentSchedule.getWorkday() == Workday.FRIDAY) { System.out.println("Hurray! Tomorrow is weekend!"); } ``` 或在`switch`塊中: ```java switch(currentSchedule.getWorkday()) { case MONDAY: case TUESDAY: case WEDNESDAY: case THURSDAY: System.out.println("Working and working and..."); break; case FRIDAY: System.out.println("Hurray! Tomorrow is weekend!"); break; default: System.out.println("Unknown day -.-"); } ``` ## 迭代枚舉 迭代枚舉非常簡單。 枚舉類定義了一個稱為`values()`的方法,該方法返回給定枚舉的值。 最好是看一個示例: ```java for(Workday w : Workday.values()) { System.out.println(w.name()); } ``` 上面的示例將產生以下輸出: ```java MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY ``` 如您所見,`values()`的順序與枚舉本身中定義的順序相同。 因此,Java 不會進行任何魔術排序。 ## 枚舉字段 有時,您只想將枚舉打印到控制臺(或以某種 UI 形式顯示)。 在上面的示例(工作日)中,您可以簡單地使用枚舉的名稱,盡管有時“`TUESDAY`”似乎很喊,而“`Tuesday`”更可取。 在這種情況下,您可以添加和使用`Enum`對象的自定義字段: ```java public enum Workday { MONDAY("Monday"), TUESDAY("Tuesday"), WEDNESDAY("Wednesday"), THURSDAY("Thursday"), FRIDAY("Friday"); private final String representation; private Workday(String representation) { this.representation = representation; } } ``` 如您在上面的示例中所看到的,枚舉獲取一個私有字段,在這種情況下稱為表示形式。 該字段是最終字段,因此以后無法更改,這意味著必須在枚舉構造期間初始化此屬性。 這是通過構造器完成的,并且提供了構造器參數以及枚舉定義。 您可以根據需要在枚舉中擁有任意數量的屬性/字段,但是我建議您將這個數量保持在較低的水平,因為具有 15 個額外屬性的枚舉確實很奇怪。 在這種情況下,我將考慮使用一個類和/或多個枚舉來保存相同的信息。 ## 枚舉方法 枚舉字段很好,但是如何訪問該字段? 我告訴過您,新的表示形式是表示該枚舉的值,但是當前我們無法在枚舉本身之外訪問該屬性。 除此之外,還有一個基本方法可用于所有枚舉:`name()`以字符串形式返回當前值的名稱。 這意味著在基本情況下,您可以使用此方法顯示枚舉的值(例如,在 UI 或日志條目中)。 **當然**也存在`toString()`函數,但是有時開發人員會覆蓋它,以使其對程序員更友好(或用戶友好?)顯示。 作為最佳實踐,如果要顯示枚舉的名稱,建議您使用`name()`方法而不是`toString()`。 要從上面更改表示示例(當我們遍歷`values()`時),只需編寫一個函數,該函數將返回新的變量表示并在迭代中使用它: ```java public enum Workday { MONDAY("Monday"), TUESDAY("Tuesday"), WEDNESDAY("Wednesday"), THURSDAY("Thursday"), FRIDAY("Friday"); private final String representation; private Workday(String representation) { this.representation = representation; } public String getRepresentation() { return this.representation; } } ``` 現在更新迭代: ```java for(Workday w : Workday.values()) { System.out.println(w.getRepresentation()); } ``` 現在,結果如下: ```java Monday Tuesday Wednesday Thursday Friday ``` 但這不是唯一可以實現枚舉方法的用法。 在下一節中,我們將看到如何將`Enum`值映射到`String`并返回。 ## 實現接口 關于枚舉鮮為人知的一件事是它們可以實現接口。 這意味著,如果您需要不同枚舉所需要的通用功能,則可以使用一個接口定義它,而枚舉必須在該接口中實現方法。 一種這樣的用例是使用 JPA 將枚舉值存儲在數據庫中-盡管不是按名稱或順序(可通過`@Enumeration`和`EnumType`獲得),而是通過短代碼。 在這種情況下,您可以創建一個接口,其中包含將枚舉轉換為數據庫表示形式并將枚舉轉換回的方法。 ```java public interface DatabaseEnum<T extends Enum<T>> { /** * Converts the database representation back to the enumeration value */ T fromDatabase(String representation); /** * Converts the enum value to the database representation */ String toDatabaseString(); } ``` 該接口使用泛型(由`T`類型表示),并在`String`和枚舉類型之間進行轉換。 要實現此接口,請擴展“工作日”示例: ```java public enum Workday implements DatabaseEnum<Workday>{ MONDAY("Monday"), TUESDAY("Tuesday"), WEDNESDAY("Wednesday"), THURSDAY("Thursday"), FRIDAY("Friday"); private final String representation; private Workday(String representation) { this.representation = representation; } public String getRepresentation() { return this.representation; } @Override public String toDatabaseString() { return this.representation; } @Override public Workday fromDatabase(String representation) { for(Workday wd: Workday.values()) { if(wd.representation.equals(representation)) { return wd; } } return null; } } ``` ## 使用枚舉而不是布爾值 有時,您最終得到一個采用布爾表達式的方法(或者您僅獲得一個告訴您使用布爾值的項目說明,但感覺很癢)。 在這種情況下,可以隨意引入一個新的枚舉并使用正確的值而不是布爾值。 例如,一旦我有了一個規范,告訴我必須創建一個帶有一些參數的方法和一個布爾值,稱為“`rightHandSide`”。 實際上,“`rightHandSide`”的默認值為`false`。 首先,我按照規范中的說明實現了該方法,但是這對我來說并不舒服,我認為這是擺脫這種冷酷感覺的另一種方法: ```java public void someMethod(String someParameter, boolean rightHandSide) { if(!rightHandSide) { // do something } } ``` 好吧,這似乎并不壞,但是如何擴展功能呢? 如果一方不重要怎么辦? 在這種情況下,可以使用其他布爾參數擴展該方法,但從長遠來看,它不會成功。 而且因為“`rightHandSide`”的默認值為`false`,所以我需要創建一個未提供參數的調用,并且使用`false`調用默認方法。 因此,我引入了一個名為`Side`的新枚舉,并替換了布爾參數: ```java public enum Side { RIGHT_HAND, LEFT_HAND } public void someMethod(String someParameter, Side side) { if(side == Side.RIGHT_HAND) { // do something } } ``` 現在感覺好多了,以后可以將該方法擴展到更多情況。 ## 總結 如您所見,枚舉非常適合替換常量-有時也可以使用布爾方法參數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看