Sí, eso es cierto. Al menos para el Sun javac. Echar un vistazo al siguiente ejemplo:
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
}
Se define un static int access$002(int)
para ajustar el valor, y una static int access$000()
para obtener el valor. El colocador también devuelve el valor, presumiblemente para compilar fácilmente 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
}
En la línea 2 y en la línea 9 que llama el setter (access$002
) y getter (access$000
) respectivamente.
Tenga en cuenta que solo presenta estos métodos de acceso si son necesarios. El campo bar
, por ejemplo, nunca fue accedido desde fuera de la clase, por lo tanto, el compilador solo generó un getter/setter para el campo foo
.
+1 Gran respuesta. Entonces, ¿siempre debe declarar la clase de miembro estática private/package-private/protected y dejar los campos de miembro package-private? – helpermethod
@Helper Method - No - ve mi respuesta. –
Debe hacer lo que sea apropiado para el campo en cuestión. Si tiene sentido que sea privado, hazlo privado. No se preocupe por los problemas de rendimiento, etc., hasta que sea importante, y luego perfile el programa en su totalidad y vea dónde obtiene la optimización al máximo. (Ciertamente no será en casos como estos). – aioobe