Mr_*_*s_D 8 java enums jvm java-synthetic-methods
复制者:
enum IDs {
ID {
@Override
void getId() {
w(); // warning here
}
};
void getId() {}
private static void w() {}
}
Run Code Online (Sandbox Code Playgroud)
发出警告:
从类型ID访问封闭方法w()由合成访问器方法模拟
我理解合成方法是什么 - 我没有得到的是它们如何与枚举结合 - 我希望枚举实例具有我在枚举中定义的所有私有方法.实例是否真的是嵌套类?
正如您在此处所做的那样,定义方法的枚举实例ID
是枚举类的隐式匿名子类的单例。正常的访问规则适用于子类和枚举类之间,因此需要合成访问器来查看枚举类的私有功能。
Java 语言规范要求枚举以这种方式工作:
\n\n\n\n\n枚举常量的可选类主体隐式定义了一个匿名类声明 (\xc2\xa715.9.5),该声明扩展了直接封闭的枚举类型。类主体受匿名类的通常规则管辖......
\n
这当然是它们的实际实施方式。在 JDK 的 javac 中,这发生在JavacParser::enumeratorDeclaration
第 3344 行左右(在此版本中):
JCClassDecl body = null;\nif (token.kind == LBRACE) {\n JCModifiers mods1 = F.at(Position.NOPOS).Modifiers(Flags.ENUM | Flags.STATIC);\n List<JCTree> defs = classOrInterfaceBody(names.empty, false);\n body = toP(F.at(identPos).AnonymousClassDef(mods1, defs));\n}\nif (args.isEmpty() && body == null)\n createPos = identPos;\nJCIdent ident = F.at(identPos).Ident(enumName);\nJCNewClass create = F.at(createPos).NewClass(null, typeArgs, ident, args, body);\n
Run Code Online (Sandbox Code Playgroud)\n\n相关位是,如果LBRACE
声明中有左大括号 ( ),则将类体解析 ( classOrInterfaceBody(...)
) 为匿名类 ( ),然后将其用作实例创建表达式 ( )names.empty
中的类体NewClass(..., body)
。如果您愿意,您可以完成JCNewClass
节点的编译,但正如其 javadoc 所做的那样,它可以建模:
* A new(...) operation.\n
Run Code Online (Sandbox Code Playgroud)\n\n如您所知,new
对类主体的操作会创建一个匿名类。
归档时间: |
|
查看次数: |
337 次 |
最近记录: |