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

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                <!-- The Mystery of values() --> ## values 方法的神秘之處 前面已經提到,編譯器為你創建的 enum 類都繼承自 Enum 類。然而,如果你研究一下 Enum 類就會發現,它并沒有 values() 方法。可我們明明已經用過該方法了,難道存在某種“隱藏的”方法嗎?我們可以利用反射機制編寫一個簡單的程序,來查看其中的究竟: ```java // enums/Reflection.java // Analyzing enums using reflection import java.lang.reflect.*; import java.util.*; import onjava.*; enum Explore { HERE, THERE } public class Reflection { public static Set<String> analyze(Class<?> enumClass) { System.out.println( "_____ Analyzing " + enumClass + " _____"); System.out.println("Interfaces:"); for(Type t : enumClass.getGenericInterfaces()) System.out.println(t); System.out.println( "Base: " + enumClass.getSuperclass()); System.out.println("Methods: "); Set<String> methods = new TreeSet<>(); for(Method m : enumClass.getMethods()) methods.add(m.getName()); System.out.println(methods); return methods; } public static void main(String[] args) { Set<String> exploreMethods = analyze(Explore.class); Set<String> enumMethods = analyze(Enum.class); System.out.println( "Explore.containsAll(Enum)? " + exploreMethods.containsAll(enumMethods)); System.out.print("Explore.removeAll(Enum): "); exploreMethods.removeAll(enumMethods); System.out.println(exploreMethods); // Decompile the code for the enum: OSExecute.command( "javap -cp build/classes/main Explore"); } } ``` 輸出為: ```java _____ Analyzing class Explore _____ Interfaces: Base: class java.lang.Enum Methods: [compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, values, wait] _____ Analyzing class java.lang.Enum _____ Interfaces: java.lang.Comparable<E> interface java.io.Serializable Base: class java.lang.Object Methods: [compareTo, equals, getClass, getDeclaringClass, hashCode, name, notify, notifyAll, ordinal, toString, valueOf, wait] Explore.containsAll(Enum)? true Explore.removeAll(Enum): [values] Compiled from "Reflection.java" final class Explore extends java.lang.Enum<Explore> { public static final Explore HERE; public static final Explore THERE; public static Explore[] values(); public static Explore valueOf(java.lang.String); static {}; } ``` 答案是,values() 是由編譯器添加的 static 方法。可以看出,在創建 Explore 的過程中,編譯器還為其添加了 valueOf() 方法。這可能有點令人迷惑,Enum 類不是已經有 valueOf() 方法了嗎。 不過 Enum 中的 valueOf() 方法需要兩個參數,而這個新增的方法只需一個參數。由于這里使用的 Set 只存儲方法的名字,而不考慮方法的簽名,所以在調用 Explore.removeAll(Enum) 之后,就只剩下[values] 了。 從最后的輸出中可以看到,編譯器將 Explore 標記為 final 類,所以無法繼承自 enum,其中還有一個 static 的初始化子句,稍后我們將學習如何重定義該句。 由于擦除效應(在[泛型 ]() 章節中介紹過),反編譯無法得到 Enum 的完整信息,所以它展示的 Explore 的父類只是一個原始的 Enum,而非事實上的 Enum\<Explore\>。 由于 values() 方法是由編譯器插入到 enum 定義中的 static 方法,所以,如果你將 enum 實例向上轉型為 Enum,那么 values() 方法就不可訪問了。不過,在 Class 中有一個 getEnumConstants() 方法,所以即便 Enum 接口中沒有 values() 方法,我們仍然可以通過 Class 對象取得所有 enum 實例。 ```java // enums/UpcastEnum.java // No values() method if you upcast an enum enum Search { HITHER, YON } public class UpcastEnum { public static void main(String[] args) { Search[] vals = Search.values(); Enum e = Search.HITHER; // Upcast // e.values(); // No values() in Enum for(Enum en : e.getClass().getEnumConstants()) System.out.println(en); } } ``` 輸出為: ``` HITHER YON ``` 因為 getEnumConstants() 是 Class 上的方法,所以你甚至可以對不是枚舉的類調用此方法: ```java // enums/NonEnum.java public class NonEnum { public static void main(String[] args) { Class<Integer> intClass = Integer.class; try { for(Object en : intClass.getEnumConstants()) System.out.println(en); } catch(Exception e) { System.out.println("Expected: " + e); } } } ``` 輸出為: ```java Expected: java.lang.NullPointerException ``` 只不過,此時該方法返回 null,所以當你試圖使用其返回的結果時會發生異常。
                  <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>

                              哎呀哎呀视频在线观看