12

プライベートメソッドまたはフィールドを持つ内部クラスがある場合、コンパイラは、外部クラスがそれらのプライベート要素にアクセスできるようにするために、パッケージで保護された合成アクセサメソッドを作成する必要があります(その逆も同様です)。

それを避けるために、私は通常、すべてのフィールドとメソッドおよびコンストラクターをプライベートではなくパッケージで保護します。

しかし、クラス自体の可視性はどうですか?にオーバーヘッドはありますか

 private static class A {
      A(){}
 }

 static class A {
      A(){}
 }

どちらの場合もコンストラクターはパッケージで保護されていることに注意してください。それとも、クラスをプライベートにすると変更されますか?

4

3 に答える 3

18

コンパイルしてバイトコードを比較してみましたか?これが私の結果です。為に:

public class Example {
  public static void main(String[] args) {
    System.out.println("Hello world!");
  }
  private static class A {
    A(){}
  }
}

上記により、次の *.class ファイルが生成されます。

-rw-r--r--    1 michaelsafyan  staff   238 Feb 10 00:11 Example$A.class
-rw-r--r--    1 michaelsafyan  staff   474 Feb 10 00:11 Example.class

ここで、クラス ファイルを移動し、private修飾子を削除して再コンパイルすると、次のようになります。

 -rw-r--r--    1 michaelsafyan  staff   238 Feb 10 00:15 Example$A.class
 -rw-r--r--    1 michaelsafyan  staff   474 Feb 10 00:15 Example.class

クラス ファイルの VM 仕様を見ると、アクセス修飾子を指定するための一定サイズのビット フィールドがあることがわかります。そのため、生成されたファイルが同じサイズであることは驚くべきことではありません。

要するに、アクセス修飾子は、生成されたバイト コードのサイズに影響を与えません (また、パフォーマンスに影響を与えることもありません)。最も理にかなったアクセス修飾子を使用する必要があります。

staticまた、内部クラスを宣言されているから宣言されていないに変更すると、わずかな違いがあることも付け加えておく必要がありますstatic。これは、外部クラスを参照する追加のフィールドを意味するためです。これは、内部クラスを宣言した場合よりもわずかに多くのメモリを消費しますが、staticこれを最適化するのは正気ではありません (static意味のある場所で使用し、非静的にする必要がある場合は非静的にしますが、メモリのポインターをあちこちに保存するためだけにデザインを複雑にしないでください)。

于 2011-02-10T05:24:50.633 に答える
9

プライベート 内部クラスと非プライベート 内部クラスの間にパフォーマンスの違いがあってはなりません。

静的内部クラス (private かどうかに関係なく) と外部クラスの間にパフォーマンスの違いがあってはなりません。

静的内部クラスと非静的内部クラスの間には、わずかなパフォーマンスの違いがあります。この違いは、非静的ケースには、それを囲むクラスのインスタンスへの非表示の参照があるという事実によるものです。これは追加のパラメーターとして内部クラスのコンストラクターに渡され、隠し変数に格納されます。

于 2011-02-10T05:57:55.937 に答える
4

これによって大幅な速度低下が発生する可能性はほとんどありません。

非静的内部クラスで注意すべき問題の1つは、それらが包含クラスのインスタンスへの参照を含んでいることです。

そのため、これは「メモリリーク」を引き起こす可能性があります。これは、囲んでいるインスタンスをガベージコレクションできないためです。内部クラスのインスタンスを呼び出し元に渡すと、それを囲むクラスのインスタンスも渡すことになります。

これは静的内部クラスには当てはまりません!

合成メソッドを防ぐためにすべてのフィールドをパッケージ保護することはお勧めできません。あなたは持っている価値のあるカプセル化をあきらめています。あなたの懸念は何ですか?追加コードのクラスファイルのサイズは?

于 2011-02-10T06:43:25.403 に答える