次のクラスがあると考えてください
public class OuterClass {
...
private static class InnerClass {
int foo;
int bar;
}
}
静的メンバークラスの属性をプライベートとして宣言する場合、外部クラスが実際に静的メンバークラスの(これは事実上、パッケージプライベートのトップレベルクラス)属性です。
それについて何かアイデアはありますか?
次のクラスがあると考えてください
public class OuterClass {
...
private static class InnerClass {
int foo;
int bar;
}
}
静的メンバークラスの属性をプライベートとして宣言する場合、外部クラスが実際に静的メンバークラスの(これは事実上、パッケージプライベートのトップレベルクラス)属性です。
それについて何かアイデアはありますか?
はい、そうです。少なくともSunjavacについては。次の例を見てください。
public class OuterClass {
public static void main(String... args) {
InnerClass.foo = 7;
System.out.println(InnerClass.foo);
}
private static class InnerClass {
private static int foo;
private static int bar;
}
}
$ javap -c OuterClass\$InnerClass
Compiled from "OuterClass.java"
class OuterClass$InnerClass extends java.lang.Object{
static int access$002(int);
Code:
0: iload_0
1: dup
2: putstatic #1; //Field foo:I
5: ireturn
static int access$000();
Code:
0: getstatic #1; //Field foo:I
3: ireturn
}
static int access$002(int)
値を設定するためのと、値を取得するためのを定義しstatic int access$000()
ます。セッターは、おそらく簡単にコンパイルするために、値も返しますsomeVariable = InnerClass.foo = 5
。
$ javap -c OuterClass
Compiled from "OuterClass.java"
public class OuterClass extends java.lang.Object{
public OuterClass();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 7
2: invokestatic #2; //Method OuterClass$InnerClass.access$002:(I)I
5: pop
6: getstatic #3; //Field java/lang/System.out:Ljava/io/PrintStream;
9: invokestatic #4; //Method OuterClass$InnerClass.access$000:()I
12: invokevirtual #5; //Method java/io/PrintStream.println:(I)V
15: return
}
2行目と9行目では、それぞれセッター(access$002
)とゲッター()を呼び出しaccess$000
ます。
また、これらのアクセサーメソッドは必要な場合にのみ導入されることにも注意してください。bar
たとえば、フィールドはクラスの外部からアクセスされることはなかったため、コンパイラはフィールドのゲッター/セッターのみを生成しましたfoo
。
それについて何かアイデアはありますか?
@aioobeの答えは、あなたが正しかったことを示しています。
ただし、おそらく違いはありません。JITコンパイラがアクセサメソッドの呼び出しをインライン化し、結果のネイティブコードが単純なフェッチと同じになる可能性があります。JITコンパイラがそれを行わない場合でも、実際のアプリケーションのコンテキストでは、パフォーマンスの低下は重要ではない可能性があります。
これが言うことは、あなたが本当に表現したいものとは異なる何かを言うアクセス修飾子を使用することによって、コードを時期尚早に「最適化」する意味がないということです。