2006/10/28

[Java]nested class, private menber

Javaでは、ネストしたクラスを使用すると、囲んだクラスとの間でprivateなメンバ(フィールドやメソッド)を参照できることになっている。

こんなコードがあったとする。ソースコードを見る限りフィールドにアクセスしているように見えるが、実際にコンパイルした後は違う形に書き換えられている。

public class Declare {     private int foo;     public class Inner {         public int getFoo() {             return foo;         }     } }

以下が、コンパイル後の構成を擬似的にコードに置き換えた内容。

public class Declare {     private int foo;     int fooAccess() {         return foo;     } } public class Declare$Inner { private Declare declare;     public int getFoo() {         return declare.fooAccess();     } }

InnerクラスはDeclare$Innerというファイル名(匿名クラスであればDeclare$1のような名前にされる)で、完全に独立したクラスとして生成され、囲んだクラスのインスタンスを参照している。
こうなると、Innerからはプライベートメンバーにアクセスすることができなくなるので、DeclareクラスにはfooAccessというメソッドが勝手に追加されている。今回は分かりやすいようにfooAccessという名前のメソッドにしているが、実際にはコンパイラが好きなように付ける。ユーザが作成するメソッド名とかぶらないようにすることは義務付けられている。

ラベル:

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム