¿Ha intentado compilarlo y comparar el código de bytes? Aquí están mis resultados. Por:
public class Example {
public static void main(String[] args) {
System.out.println("Hello world!");
}
private static class A {
A(){}
}
}
Lo anterior produce los siguientes archivos * .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
Ahora, si muevo los archivos de clase, elimine el modificador private
, y recompilar, me sale:
-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
Si mira el VM Spec on class files, verá que hay un campo de bits de tamaño constante para especificar los modificadores de acceso, por lo que no debería sorprender que los archivos generados sean los mismos tamaño.
En resumen, los modificadores de acceso no afectarán el tamaño del código de bytes generado (tampoco debe tener ningún impacto en el rendimiento). Debe usar el modificador de acceso que tenga más sentido.
También debo añadir que hay una pequeña diferencia si se cambia la clase interna de static
a no declarada static
, ya que implica un campo adicional que hace referencia a la clase externa. Esto ocupará un poco más de memoria que si declaraste la clase interna static
, pero estarías loco por optimizar esto (usa static
donde tenga sentido, y donde lo necesites no sea estático, hazlo no estático , pero no convine su diseño solo para guardar un puntero de memoria aquí o allá).
posible duplicado de [¿Son livianas las clases internas?] (Http://stackoverflow.com/questions/4812464/are-inner-classes-lightweight) – templatetypedef
Me pregunto si la visibilidad reducida se aprovecha de alguna manera con el punto de acceso. También me pregunto si los compiladores de Java pueden usar este hecho para excluir a la clase de consideración fuera de su alcance de visibilidad. Interesante pregunta, pero no creo que haya ningún beneficio práctico. – Ron
@Ron: el compilador/IDE sin duda verificará la visibilidad y realizará errores de compilación o eliminarlos de la función autocompletar. Me pregunto si algo está sucediendo en tiempo de ejecución. – Thilo