リプロデューサー:
enum IDs {
ID {
@Override
void getId() {
w(); // warning here
}
};
void getId() {}
private static void w() {}
}
警告が発せられました:
タイプIDからの囲みメソッドw()へのアクセスは、合成アクセサーメソッドによってエミュレートされます。
合成メソッドとは何かを理解しています-私が得られないのは、それらが列挙型とどのように関係するかです-列挙型インスタンスには、列挙型で定義したすべてのプライベートメソッドがあると思います。インスタンスは本当にネストされたクラスですか?
ID
ここで行うように、メソッドを定義するenumインスタンスは、enumクラスの暗黙的な匿名サブクラスのシングルトンです。通常のアクセスルールはサブクラスと列挙型クラスの間に適用されるため、列挙型クラスのプライベート機能を表示するには合成アクセサーが必要です。
Java言語仕様では、このように機能するために列挙型が必要です。
列挙型定数のオプションのクラス本体は、すぐに囲む列挙型を拡張する匿名クラス宣言(§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
は、宣言に左中括弧()がある場合、クラス本体がclassOrInterfaceBody(...)
匿名クラス(names.empty
)に対して解析され()、これがインスタンス作成式(NewClass(..., body)
)のクラス本体として使用されることです。。JCNewClass
必要に応じてノードのコンパイルを実行できますが、javadocと同様に、次のようにモデル化されていると言えば十分です。
* A new(...) operation.
ご存知のように、new
クラス本体を使用した操作では、匿名クラスが作成されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加