[英]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.