Google の方が適切に説明できるので、言い換えはしません。
仮定: 親クラスはFoo
、内部クラスはFoo$Inner
:
問題は、VM が Foo$Inner から Foo のプライベート メンバーへの直接アクセスを違法であると見なすことです。これは、Java 言語では内部クラスが外部クラスのプライベート メンバーにアクセスできるにもかかわらず、Foo と Foo$Inner は異なるクラスであるためです。ギャップを埋めるために、コンパイラはいくつかの合成メソッドを生成します。
/*package*/ static int Foo.access$100(Foo foo) {
return foo.mValue;
}
/*package*/ static void Foo.access$200(Foo foo, int value) {
foo.doStuff(value);
}
内部クラス コードは、mValue フィールドにアクセスする必要があるとき、または外部クラスで doStuff メソッドを呼び出す必要があるときはいつでも、これらの静的メソッドを呼び出します。これが意味することは、上記のコードは、アクセサー メソッドを介してメンバー フィールドにアクセスしているケースに要約されるということです。前に、アクセサーがフィールドへの直接アクセスよりも遅いことについて説明したので、これは特定の言語イディオムが「目に見えない」パフォーマンス ヒットをもたらす例です。
パフォーマンスのホットスポットでこのようなコードを使用している場合は、内部クラスによってアクセスされるフィールドとメソッドをプライベート アクセスではなくパッケージ アクセスを持つように宣言することで、オーバーヘッドを回避できます。残念ながら、これはフィールドが同じパッケージ内の他のクラスから直接アクセスできることを意味するため、パブリック API ではこれを使用しないでください。
ソース: https://developer.android.com/training/articles/perf-tips.html#PackageInner