私は最近、Jake Whartonによってthis articleを読んでいます。これはAndroidを対象にしていますが、Javaについても完全に有効です。我々は(これはAへの参照を有し、そのメンバーをacccessことができる)、単純なクラスAおよび内部クラスBを有するメソッドの可視性とそのコスト
public class A {
private String someField = "abc";
class B {
public void doSomething() {
System.out.println(someField);
}
}
}
:
は、以下のコードを検討してください。プライベートであっても、クラスBはAのフィールドsomeField
にアクセスしています。記事によると、これは内部クラスがフィールドにアクセスすることを可能にするsynthetic accessor methods
を生成するコンパイラによって行われます。
私のやり方は基本的な質問です。なぜコンパイラはコードをコンパイルするときに可視性について気にするのですか?この例で見てきたように、基本的にオーバーヘッドを導入する新しいメソッドが生成されます。
可視性は良いソフトウェアを構築する上では大変ですが、宣言されたvisibiliesに基づいてすべてが正しいことをコンパイラがチェックしていれば、それらのメソッドを最適化しないでください(例:すべてをpublicにして呼び出します)。
まず、これはセキュリティ上の理由によるものだと思っていましたが、反射ではすべてのフィールドへのアクセスが許可されています。
これは私の基本的な誤解かもしれません、もしそうなら、誰かが私にそれを説明することができれば嬉しいです。
"コンパイラは、コードがコンパイルされていると、なぜ可視性について気にするのですか?"コードを検証する何かが気になる可能性があります。もちろん、JITコンパイラはメソッド呼び出しをインラインするのにはかなり良い場所にありますが、それは別の問題です。 (リフレクションはセキュリティマネージャーで無効にすることができます - これは*実行時に強制されますが、実際にはコンパイラがいくつかの環境では失敗するコードを生成したくない...) –