【问题标题】:Are enum instances "enclosed" in the enum type in java?枚举实例是否“封闭”在 java 中的枚举类型中?
【发布时间】:2013-10-19 10:56:02
【问题描述】:

复制者:

enum IDs {
    ID {

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

    void getId() {}

    private static void w() {}
}

发出警告:

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

我了解合成方法是什么——我不明白它们如何与枚举一起使用——我希望枚举实例具有我在枚举中定义的所有私有方法。实例真的是嵌套类吗?

【问题讨论】:

    标签: java enums jvm java-synthetic-methods


    【解决方案1】:

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

    Java 语言规范requires enums to work this way

    枚举常量的可选类主体隐式定义了一个匿名类声明(第 15.9.5 节),它扩展了直接封闭的枚举类型。类体由匿名类的常规规则管理...

    这当然是它们的实际实施方式。在 JDK 的 javac 中,这发生在 JavacParser::enumeratorDeclaration 第 3344 行附近(在此版本中):

    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),则为匿名类(names.empty)解析一个类体(classOrInterfaceBody(...)),然后就是这样用作实例创建表达式中的类主体 (NewClass(..., body))。如果您愿意,您可以按照 JCNewClass 节点的编译进行操作,但正如它的 javadoc 所做的那样,它可以建模:

     * A new(...) operation.
    

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

    【讨论】:

      猜你喜欢
      • 2015-05-05
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多