1. 程式人生 > >java 列舉類 getClass和getDeclaringClass的區別

java 列舉類 getClass和getDeclaringClass的區別

在使用列舉類的時候,建議用getDeclaringClass返回列舉類。但是為什麼不用getClass呢?下面來看看程式碼:

    public enum FruitEnum{
        BANANA,APPLE;

        public static void main(String[] args) {
            System.out.println(BANANA.getDeclaringClass());
            System.out.println(BANANA.getClass());
        }
    }

    # 執行結果
class FruitEnum class FruitEnum }

有人說結果不是一樣嗎?不急,看下面這種情況。

    public enum FruitEnum{
        BANANA{
            String getName() {
                return "香蕉";
            }
        },APPLE{
            String getName() {
                return "蘋果";
            }
        };

        abstract
String getName(); public static void main(String[] args) { System.out.println(BANANA.getDeclaringClass()); System.out.println(BANANA.getClass()); } } # 執行結果 class FruitEnum class FruitEnum$1

這種情況下就不同了。因為此時BANANAAPPLE相當於FruitEnum的內部類。下面來看看Enum

的原始碼:

    public final Class<E> getDeclaringClass() {
        Class var1 = this.getClass();
        Class var2 = var1.getSuperclass(); // 獲取上一級的父類
        return var2 == Enum.class?var1:var2;
    }

當上一級的父類不是Enum,則返回上一級的class。因此對列舉類進行比較的時候,使用getDeclaringClass是萬無一失的。