He estado usando Eclipse como mi IDE de desarrollo. También lo uso para exportar mi aplicación a un archivo .jar. Cuando miro mis clases en el archivo .jar, algunas de mis clases contienen el nombre de esa clase, un signo de dólar y luego un número. Ejemplo:
- Encuentra $ 1.clase
- Encuentra $ 2.clase
- Encuentra $ 3.clase
- Find.class
He notado que hace esto en clases más grandes. ¿Es esto porque las clases se vuelven tan grandes que las compila en múltiples clases? Busqué en Google y busqué en varios foros, y busqué la documentación de Java, pero no encontré nada relacionado con ella. ¿Alguien podría explicarlo?
java
class
compilation
Frizinator
fuente
fuente
Respuestas:
Las clases internas, si hay alguna presente en su clase, serán compiladas y el archivo de clases será
ClassName$InnerClassName
. En el caso de clases internas anónimas, aparecerá como números. El tamaño de la clase (código Java) no conduce a la generación de varias clases.Por ejemplo, dado este fragmento de código:
public class TestInnerOuterClass { class TestInnerChild{ } Serializable annoymousTest = new Serializable() { }; }
Las clases que se generarán serán:
TestInnerOuterClass.class
TestInnerOuterClass$TestInnerChild.class
TestInnerOuterCasss$1.class
Actualizar:
El uso de clases anónimas no se considera una mala práctica, solo depende del uso.
Consulte esta discusión sobre SO
fuente
Esto se debe a que tiene clases anónimas dentro de esta clase más grande. Se compilan utilizando esta convención de nomenclatura.
Ver el dilema de la clase anónima
fuente
Además de los casos anteriores presentados por @mprabhat, los otros casos podrían ser:
Estos casos son derivaciones de mi inspección en archivos .class en jar.
fuente
Para responder a tu comentario sobre clases anónimas son malas. Definitivamente no lo son. Considere esto para asignar un oyente de acción a un JButton:
JButton button = new JButton(...); button.addActionListener(new ActionListener() { ... });
o esto para hacer una ordenación insensible a mayúsculas y minúsculas por la propiedad "nombre"
Collections.sort( array, new Comparator<Foo>() { public int compare(Foo f1, Foo f2) { return f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase()); } });
También verá una gran cantidad de Runnable y Callable realizadas como clases anónimas.
fuente