簡體   English   中英

Java中的枚舉類型是否將枚舉實例“封閉”?

[英]Are enum instances “enclosed” in the enum type in java?

復制者:

enum IDs {
    ID {

        @Override
        void getId() {
            w(); // warning here
        }
    };

    void getId() {}

    private static void w() {}
}

發出警告:

通過綜合訪問器方法模擬從類型ID對封閉方法w()的訪問

我了解什么是綜合方法-我沒有得到的是它們如何與枚舉一起使用-我希望枚舉實例具有我在枚舉中定義的所有私有方法。 實例真的是嵌套類嗎?

像您的ID一樣,定義方法的枚舉實例是枚舉類的隱式匿名子類的單例。 常規訪問規則適用於子類和枚舉類之間,因此需要綜合訪問器才能查看枚舉類的私有功能。

Java語言規范要求枚舉以這種方式工作

枚舉常量的可選類主體隱式定義了一個匿名類聲明(第15.9.5節),該聲明擴展了立即封閉的枚舉類型。 類主體由匿名類的通常規則控制。

當然,這實際上是它們的實現方式。 在JDK的javac中,這發生在3344行(在此版本中)的JavacParser::enumeratorDeclaration中:

JCClassDecl body = null;
if (token.kind == LBRACE) {
    JCModifiers mods1 = F.at(Position.NOPOS).Modifiers(Flags.ENUM | Flags.STATIC);
    List<JCTree> defs = classOrInterfaceBody(names.empty, false);
    body = toP(F.at(identPos).AnonymousClassDef(mods1, defs));
}
if (args.isEmpty() && body == null)
    createPos = identPos;
JCIdent ident = F.at(identPos).Ident(enumName);
JCNewClass create = F.at(createPos).NewClass(null, typeArgs, ident, args, body);

相關的位是,如果聲明中有左花括號( LBRACE ),則將解析類類( classOrInterfaceBody(...) )為匿名類( names.empty ),然后將其用作實例創建表達式中的類主體( NewClass(..., body) )。 如果願意,可以遵循JCNewClass節點的編譯過程,但是足以說明它的javadoc模型:

 * A new(...) operation.

如您所知,帶有類主體的new操作將創建一個匿名類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM