<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                <!-- Constant-Specific Methods --> ## 常量特定方法 Java 的 enum 有一個非常有趣的特性,即它允許程序員為 enum 實例編寫方法,從而為每個 enum 實例賦予各自不同的行為。要實現常量相關的方法,你需要為 enum 定義一個或多個 abstract 方法,然后為每個 enum 實例實現該抽象方法。參考下面的例子: ```java // enums/ConstantSpecificMethod.java import java.util.*; import java.text.*; public enum ConstantSpecificMethod { DATE_TIME { @Override String getInfo() { return DateFormat.getDateInstance() .format(new Date()); } }, CLASSPATH { @Override String getInfo() { return System.getenv("CLASSPATH"); } }, VERSION { @Override String getInfo() { return System.getProperty("java.version"); } }; abstract String getInfo(); public static void main(String[] args) { for(ConstantSpecificMethod csm : values()) System.out.println(csm.getInfo()); } } ``` 輸出為: ```java May 9, 2017 C:\Users\Bruce\Documents\GitHub\on- java\ExtractedExamples\\gradle\wrapper\gradle- wrapper.jar 1.8.0_112 ``` 通過相應的 enum 實例,我們可以調用其上的方法。這通常也稱為表驅動的代碼(table-driven code,請注意它與前面提到的命令模式的相似之處)。 在面向對象的程序設計中,不同的行為與不同的類關聯。而通過常量相關的方法,每個 enum 實例可以具備自己獨特的行為,這似乎說明每個 enum 實例就像一個獨特的類。在上面的例子中,enum 實例似乎被當作其“超類”ConstantSpecificMethod 來使用,在調用 getInfo() 方法時,體現出多態的行為。 然而,enum 實例與類的相似之處也僅限于此了。我們并不能真的將 enum 實例作為一個類型來使用: ```java // enums/NotClasses.java // {javap -c LikeClasses} enum LikeClasses { WINKEN { @Override void behavior() { System.out.println("Behavior1"); } }, BLINKEN { @Override void behavior() { System.out.println("Behavior2"); } }, NOD { @Override void behavior() { System.out.println("Behavior3"); } }; abstract void behavior(); } public class NotClasses { // void f1(LikeClasses.WINKEN instance) {} // Nope } ``` 輸出為(前 12 行): ``` Compiled from "NotClasses.java" abstract class LikeClasses extends java.lang.Enum<LikeClasses> { public static final LikeClasses WINKEN; public static final LikeClasses BLINKEN; public static final LikeClasses NOD; public static LikeClasses[] values(); Code: 0: getstatic #2 // Field $VALUES:[LLikeClasses; 3: invokevirtual #3 // Method "[LLikeClasses;".clone:()Ljava/lang/Object; ... ``` 在方法 f1() 中,編譯器不允許我們將一個 enum 實例當作 class 類型。如果我們分析一下編譯器生成的代碼,就知道這種行為也是很正常的。因為每個 enum 元素都是一個 LikeClasses 類型的 static final 實例。 同時,由于它們是 static 實例,無法訪問外部類的非 static 元素或方法,所以對于內部的 enum 的實例而言,其行為與一般的內部類并不相同。 再看一個更有趣的關于洗車的例子。每個顧客在洗車時,都有一個選擇菜單,每個選擇對應一個不同的動作。可以將一個常量相關的方法關聯到一個選擇上,再使用一個 EnumSet 來保存客戶的選擇: ```java // enums/CarWash.java import java.util.*; public class CarWash { public enum Cycle { UNDERBODY { @Override void action() { System.out.println("Spraying the underbody"); } }, WHEELWASH { @Override void action() { System.out.println("Washing the wheels"); } }, PREWASH { @Override void action() { System.out.println("Loosening the dirt"); } }, BASIC { @Override void action() { System.out.println("The basic wash"); } }, HOTWAX { @Override void action() { System.out.println("Applying hot wax"); } }, RINSE { @Override void action() { System.out.println("Rinsing"); } }, BLOWDRY { @Override void action() { System.out.println("Blowing dry"); } }; abstract void action(); } EnumSet<Cycle> cycles = EnumSet.of(Cycle.BASIC, Cycle.RINSE); public void add(Cycle cycle) { cycles.add(cycle); } public void washCar() { for(Cycle c : cycles) c.action(); } @Override public String toString() { return cycles.toString(); } public static void main(String[] args) { CarWash wash = new CarWash(); System.out.println(wash); wash.washCar(); // Order of addition is unimportant: wash.add(Cycle.BLOWDRY); wash.add(Cycle.BLOWDRY); // Duplicates ignored wash.add(Cycle.RINSE); wash.add(Cycle.HOTWAX); System.out.println(wash); wash.washCar(); } } ``` 輸出為: ``` [BASIC, RINSE] The basic wash Rinsing [BASIC, HOTWAX, RINSE, BLOWDRY] The basic wash Applying hot wax Rinsing Blowing dry ``` 與使用匿名內部類相比較,定義常量相關方法的語法更高效、簡潔。 這個例子也展示了 EnumSet 了一些特性。因為它是一個集合,所以對于同一個元素而言,只能出現一次,因此對同一個參數重復地調用 add0 方法會被忽略掉(這是正確的行為,因為一個 bit 位開關只能“打開”一次),同樣地,向 EnumSet 添加 enum 實例的順序并不重要,因為其輸出的次序決定于 enum 實例定義時的次序。 除了實現 abstract 方法以外,程序員是否可以覆蓋常量相關的方法呢?答案是肯定的,參考下面的程序: ```java // enums/OverrideConstantSpecific.java public enum OverrideConstantSpecific { NUT, BOLT, WASHER { @Override void f() { System.out.println("Overridden method"); } }; void f() { System.out.println("default behavior"); } public static void main(String[] args) { for(OverrideConstantSpecific ocs : values()) { System.out.print(ocs + ": "); ocs.f(); } } } ``` 輸出為: ``` NUT: default behavior BOLT: default behavior WASHER: Overridden method ``` 雖然 enum 有某些限制,但是一般而言,我們還是可以將其看作是類。
                  <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>

                              哎呀哎呀视频在线观看