Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否为枚举实例;随函附上“;在java中的枚举类型中?_Java_Enums_Jvm_Java Synthetic Methods - Fatal编程技术网

是否为枚举实例;随函附上“;在java中的枚举类型中?

是否为枚举实例;随函附上“;在java中的枚举类型中?,java,enums,jvm,java-synthetic-methods,Java,Enums,Jvm,Java Synthetic Methods,复制者: enum IDs { ID { @Override void getId() { w(); // warning here } }; void getId() {} private static void w() {} } 发出警告: 通过合成访问器方法模拟从类型ID访问封闭方法w() 我了解合成方法是什么-我不知道它们是如何与enum一起使用的-我希望enum实例拥有我在e

复制者:

enum IDs {
    ID {

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

    void getId() {}

    private static void w() {}
}
发出警告:

通过合成访问器方法模拟从类型ID访问封闭方法w()


我了解合成方法是什么-我不知道它们是如何与enum一起使用的-我希望enum实例拥有我在enum中定义的所有私有方法。实例真的是嵌套类吗

定义方法的枚举实例(正如您的
ID
在这里所做的那样)是枚举类的隐式匿名子类的单例。正常的访问规则适用于子类和枚举类之间,因此需要一个合成访问器来查看枚举类的私有特性

Java语言规范:

枚举常量的可选类主体隐式定义了一个匿名类声明(§15.9.5),该声明扩展了立即封闭的枚举类型。类主体由匿名类的常规规则管理

这当然是他们实际实施的方式。在JDK的javac中,这发生在第3344行(在这个版本中):

如您所知,带有类主体的
new
操作将创建一个匿名类

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);
 * A new(...) operation.