<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 枚舉 > 原文: [https://howtodoinjava.com/java/enum/enum-tutorial/](https://howtodoinjava.com/java/enum/enum-tutorial/) **Java 枚舉**,也稱為 Java **枚舉類型**,是一種其字段由固定的**常數集**組成的類型。 枚舉的主要目的是**加強編譯時類型的安全性**。 `enum`關鍵字是 Java 中的保留關鍵字。 當我們知道在編譯時或設計時變量的所有可能值時,我們應該使用枚舉,盡管將來在標識變量時可以添加更多值。 在此 *Java 枚舉教程*中,我們將學習什么是枚舉以及它們解決了哪些問題? ```java Table of Contents 1\. What is enum in Java 2\. enum constructors 3\. enum methods 4\. enum inheritance 5\. Compare enums 6\. EnumMap and EnumSet 7\. Summary ``` ## 1\. Java 中的枚舉 [枚舉](https://en.wikipedia.org/wiki/Enumeration "Enumeration")(通常)通常是一組相關的常數。 從一開始,它們就已經使用其他編程語言,例如 C++。 在 JDK 1.4 之后,Java 設計人員決定也用 Java 支持它,并且**在 JDK 1.5 版本中正式發布**。 關鍵字`enum`支持 Java 中的**枚舉**。 枚舉是一種特殊類型的類,始終擴展 [`java.lang.Enum`](https://docs.oracle.com/javase/10/docs/api/java/lang/Enum.html) 。 ## 1.1 枚舉是保留關鍵字 Java 中的`enum`是保留關鍵字。 這意味著您不能定義名稱為`enum`的變量。 例如這將導致編譯時錯誤`"invalid VariableDeclaratorId"`。 ![enum is reserved keyword](https://img.kancloud.cn/c6/e5/c6e573c602dab2d25042f91d79b8f569_544x174.png) 枚舉是保留關鍵字 #### 1.2 Java 枚舉聲明 **創建枚舉**的簡單示例。 眾所周知,通常我們在日常生活中要處理四個方向。 它們的名稱,角度和其他屬性是固定的。 因此,在程序中,我們可以為它們創建枚舉。 創建枚舉的**語法**如下: ```java public enum Direction { EAST, WEST, NORTH, SOUTH; } ``` 從邏輯上講,**每個枚舉都是**枚舉類型本身的一個實例。 因此給定的枚舉可以看作是下面的聲明。 **JVM 在內部向此類添加序數和值方法**,我們可以在使用枚舉時調用它。 ```java final class Direction extends Enum<Direction> { public final static Direction EAST = new Direction(); public final static Direction WEST = new Direction(); public final static Direction NORTH = new Direction(); public final static Direction SOUTH = new Direction(); } ``` #### 1.3 Java 枚舉示例 我們可以像使用`final` `static`類字段一樣使用枚舉。 ```java public class EnumExample { public static void main(String[] args) { Direction north = Direction.NORTH; System.out.println(north); //Prints NORTH } } ``` #### 1.4 枚舉`ordinal()` `ordinal()`方法返回枚舉實例的順序。 它表示枚舉聲明中的**序數**,其中初始常量分配為`'0'`的序數。 它非常類似于數組索引。 它設計用于供基于復雜枚舉的數據結構使用,例如`EnumSet`和`EnumMap`。 ```java Direction.EAST.ordinal(); //0 Direction.NORTH.ordinal(); //2 ``` #### 1.5 枚舉`values()`和`valueOf()` 枚舉`values()`方法返回**枚舉數組**中的所有枚舉值。 ```java Direction[] directions = Direction.values(); for (Direction d : directions) { System.out.println(d); } //Output: EAST WEST NORTH SOUTH ``` 枚舉`valueOf()`方法有助于**將字符串轉換為枚舉**實例。 ```java Direction east = Direction.valueOf("EAST"); System.out.println(east); //Output: EAST ``` #### 1.6 枚舉命名約定 按照慣例,枚舉是**常量**。 在 Java 中,常量在所有`UPPER_CASE`字母中定義。 這也是枚舉。 * 枚舉名稱應為[標題大小寫](https://howtodoinjava.com/java/string/convert-string-to-titlecase/)(與類名相同)。 * 枚舉字段應全部大寫(與靜態最終常量相同)。 ## 2\. 枚舉構造器 默認情況下,**枚舉不需要構造器**定義,并且它們的默認值始終是聲明中使用的字符串。 不過,您可以定義自己的構造器來初始化枚舉類型的狀態。 例如,我們可以在方向上添加`angle`屬性。 所有方向都有一定角度。 因此,讓我們添加它們。 ```java public enum Direction { // enum fields EAST(0), WEST(180), NORTH(90), SOUTH(270); // constructor private Direction(final int angle) { this.angle = angle; } // internal state private int angle; public int getAngle() { return angle; } } ``` 如果要訪問任何方向的角度,可以在枚舉字段引用中進行簡單的方法調用。 ```java Direction north = Direction.NORTH; System.out.println( north ); //NORTH System.out.println( north.getAngle() ); //90 System.out.println( Direction.NORTH.getAngle() ); //90 ``` ## 3\. 枚舉方法 請記住,枚舉基本上是一種特殊的類類型,并且可以像其他任何類一樣具有方法和字段。 您可以添加**抽象**以及**具體**的方法。 枚舉中允許兩種方法。 #### 3.1 枚舉的具體方法 在枚舉中添加具體方法類似于在其他任何類中添加相同方法。 您可以使用任何訪問說明符,例如 `public`,`private`或`protected`。 您可以從枚舉方法返回值,也可以簡單地使用它們執行內部邏輯。 ```java public enum Direction { // enum fields EAST, WEST, NORTH, SOUTH; protected String printDirection() { String message = "You are moving in " + this + " direction"; System.out.println( message ); return message; } } ``` 您可以像對**枚舉實例**進行簡單方法調用一樣,調用`printDirection()`方法。 ```java Direction.NORTH.printDirection(); //You are moving in NORTH direction Direction.EAST.printDirection(); //You are moving in EAST direction ``` #### 3.2 枚舉中的抽象方法 我們可以在枚舉中添加**抽象方法**。 在這種情況下,我們必須**在每個枚舉字段**上單獨實現抽象方法。 ```java public enum Direction { // enum fields EAST { @Override public String printDirection() { String message = "You are moving in east. You will face sun in morning time."; return message; } }, WEST { @Override public String printDirection() { String message = "You are moving in west. You will face sun in evening time."; return message; } }, NORTH { @Override public String printDirection() { String message = "You are moving in north. You will face head in daytime."; return message; } }, SOUTH { @Override public String printDirection() { String message = "You are moving in south. Sea ahead."; return message; } }; public abstract String printDirection(); } ``` 重新運行上面的示例。 ```java Direction.NORTH.printDirection(); //You are moving in north. You will face head in daytime. Direction.EAST.printDirection(); //You are moving in east. You will face sun in morning time. ``` 您可以為以這種方式創建的所有枚舉強制執行契約。 它可以用作創建枚舉的**模板**。 例如,如果我們希望`Direction`的每個枚舉類型都應能夠在需要時打印帶有自定義消息的路線名稱。 這可以通過在`Direction`中定義`abstract`方法來完成,每個枚舉都必須覆蓋該方法。 將來,將在更多方向上添加(真的嗎?),那么我們還必須添加自定義消息。 ## 4\. 枚舉繼承 如前所述,枚舉擴展了`Enum`類。 `java.lang.Enum`是一個抽象類。 這是所有 Java 枚舉類型的通用基類。 ```java public abstract class Enum<E extends Enum<E>> extends Object implements Comparable<E>, Serializable { } ``` 這意味著所有枚舉都是隱式[**可比**](//howtodoinjava.com/search-sort/when-to-use-comparable-and-comparator-interfaces-in-java/ "When to use comparable and comparator interfaces in java")和[**可序列化的**](//howtodoinjava.com/java/serialization/a-mini-guide-for-implementing-serializable-interface-in-java/ "A mini guide for implementing serializable interface in java")。 此外,Java 中的所有枚舉類型默認為[**單例**](//howtodoinjava.com/design-patterns/singleton-design-pattern-in-java/ "Singleton design pattern in java")。 如前所述,所有枚舉都擴展了`java.lang.Enum`,因此**枚舉不能擴展任何其他類**,因為 Java 不支持 [**多繼承**](https://howtodoinjava.com/oops/multiple-inheritance-in-java/)。 但是枚舉可以實現任何數量的接口。 ## 5\. 比較枚舉 默認情況下,所有枚舉都是**可比較的,也是單例**。 這意味著即使使用`"=="`運算符,也可以使用`equals()`方法進行比較。 ```java Direction east = Direction.EAST; Direction eastNew = Direction.valueOf("EAST"); System.out.println( east == eastNew ); //true System.out.println( east.equals( eastNew ) ); //true ``` > 您可以使用`'=='`運算符或`equals()`方法比較**枚舉類型**,因為默認情況下枚舉是單例且可比較。 ## 6\. 枚舉集合 – `EnumSet`和`EnumMap` `java.util`包中添加了兩個類以支持枚舉 – [`EnumSet`](https://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html)(用于枚舉的高性能`Set`實現;枚舉集的所有成員必須具有相同的枚舉類型)和[`EnumMap`](https://docs.oracle.com/javase/7/docs/api/java/util/EnumMap.html)(與枚舉鍵配合使用的高性能映射實現)。 #### 6.1 `java.util.EnumSet` `EnumSet`類的定義如下: ```java public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E> implements Cloneable, Serializable { } ``` 一種專門用于枚舉類型的`Set`實現。 枚舉集中的所有元素都必須來自創建集時明確或隱式指定的單個枚舉類型。 #### 6.1.1 `EnumSet`示例 ```java public class Test { public static void main(String[] args) { Set enumSet = EnumSet.of( Direction.EAST, Direction.WEST, Direction.NORTH, Direction.SOUTH ); } } ``` 像大多數集合實現一樣,**`EnumSet`不同步**。 如果多個線程同時訪問一個枚舉集,并且至少有一個線程修改了該枚舉集,則應在外部對其進行同步。 不允許`null`元素。 同樣,這些集合可確保基于聲明枚舉常量中元素的順序來對元素進行排序。 與常規集合實現相比,性能和內存優勢非常高。 #### 6.2 `java.util.EnumMap` `EnumMap`聲明為: ```java public class EnumMap<K extends Enum<K>,V> extends AbstractMap<K,V> implements Serializable, Cloneable { } ``` 一種專門用于枚舉類型鍵的`Map`實現。 同樣,枚舉映射中的所有鍵都必須來自創建映射時顯式或隱式指定的單個枚舉類型。 像`EnumSet`一樣,不允許`null`鍵,并且**也不同步**。 #### 6.2.1 `EnumMap`示例 ```java public class Test { public static void main(String[] args) { //Keys can be only of type Direction Map enumMap = new EnumMap(Direction.class); //Populate the Map enumMap.put(Direction.EAST, Direction.EAST.getAngle()); enumMap.put(Direction.WEST, Direction.WEST.getAngle()); enumMap.put(Direction.NORTH, Direction.NORTH.getAngle()); enumMap.put(Direction.SOUTH, Direction.SOUTH.getAngle()); } } ``` ## 7\. 總結 1. 枚舉是`java.lang.Enum`類的**最終子類** 2. 如果枚舉是類的成員,則隱式地`static` 3. `new`關鍵字即使在枚舉類型本身內也不能用于初始化枚舉 4. `name()`和`valueOf()`方法僅使用枚舉常量的文本,而`toString()`方法可能會被覆蓋以提供任何內容(如果需要) 5. 對于**枚舉常量**,`equals()`和`"=="`得出相同的結果,可以互換使用 6. 枚舉常量隱式`public static final` 7. 枚舉常量列表的出現順序**稱為“自然順序”**,并且還定義了其他項使用的順序:`compareTo()`方法,值的迭代順序 `EnumSet`,`EnumSet.range()`。 8. 枚舉構造器應聲明為`private`。 編譯器允許**非私有構造器**,但這對讀者來說似乎是一種誤導,因為 new 永遠不能與枚舉類型一起使用。 9. 由于這些枚舉實例都是有效的單例,因此可以使用標識(`"=="`)比較它們的相等性。 10. 您可以在`switch`語句中使用**枚舉,例如`int`或`char`原始數據類型** 在本文中,我們從語言基礎到更高級,更有趣的實際用例,探討了 **Java 枚舉**。 學習愉快! 參考文獻: [SO 帖子](https://stackoverflow.com/questions/18883646/java-enum-methods/18883717) [枚舉 Java 文檔](https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) [Java 1.5 枚舉](http://www.ntu.edu.sg/home/ehchua/programming/java/javaenum.html)
                  <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>

                              哎呀哎呀视频在线观看