las clases comstackdas en java contienen signos de dólar

He estado usando Eclipse como mi desarrollo IDE. 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, luego un número. Ejemplo:

  • Encuentra $ 1.class
  • Encuentra $ 2.class
  • Encuentra $ 3.class
  • Find.class

Me di cuenta de que hace esto en clases más grandes. ¿Esto es porque las clases son tan grandes que se comstack en múltiples clases? Busqué en Google y miré en varios foros, y busqué en la documentación de Java pero no encontré nada relacionado con ella. ¿Alguien podría explicar?

Las clases internas, si hay alguna presente en su clase, se comstackrán y el archivo de clase será ClassName$InnerClassName . En el caso de las clases internas anónimas, aparecerá como números. El tamaño de la clase (código Java) no conduce a la generación de múltiples clases.

Por ejemplo, dado este pedazo de código:

 public class TestInnerOuterClass { class TestInnerChild{ } Serializable annoymousTest = new Serializable() { }; } 

Las clases que se generarán serán:

  1. TestInnerOuterClass.class
  2. TestInnerOuterClass$TestInnerChild.class
  3. TestInnerOuterCasss$1.class

Actualizar:

Usar clases anónimas no se considera una mala práctica, solo depende del uso.

Verifique esta discusión en SO

Esto se debe a que tienes clases anónimas dentro de esta clase más grande. Se comstackn utilizando esta convención de nombres.

Ver el acertijo de la clase anónima

Además de los casos anteriores presentados por @mprabhat, los otros casos podrían ser:

  1. si tu clase contiene una variable enum , también se generaría una clase separada para eso. El nombre de la clase .class generada sería ClassName $ Name_of_enum .
  2. Si su clase X está heredando, es decir, extendiendo otra clase Y , entonces habría una clase generada con el nombre ClassName $ 1.class o ClassName $ 1 $ 1.class
  3. Si su clase X está implementando una interfaz Y , entonces habría una clase generada con el nombre ClassName $ 1.class o ClassName $ 1 $ 1.class .

Estos casos son derivaciones de mi inspección en archivos .class en jar.

Para responder a tu comentario, las clases anónimas son malas. Definitivamente no lo son. Considere esto para asignar un detector de acciones a un JButton:

 JButton button = new JButton(...); button.addActionListener(new ActionListener() { ... }); 

o esto para hacer una clasificación insensible a mayúsculas y minúsculas por la propiedad “nombre”

 Collections.sort( array, new Comparator() { 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 hecho como clases anónimas.