¿Por qué un archivo fuente Java lleva el nombre de la clase pública que contiene?

14

Soy un novato aprendiendo Java. En Java, cada archivo fuente debe contener una clase pública y ese archivo fuente debe tener el mismo nombre que esa clase pública. Además, ningún archivo fuente puede contener dos clases públicas. ¿Por qué es esta restricción?

usuario
fuente
44
Sin los detalles, este es un artefacto de diseño histórico de la forma en que se diseñó Java. Los lenguajes diseñados más recientemente, como C #, aunque son similares a Java, no tienen esta restricción.
gahooa
13
¿No es para imponer las mejores prácticas? Pensé que esta era la única razón. En C #, no tiene esta restricción a nivel técnico, pero aún así StyleCop se quejará si el nombre del archivo y el nombre de la clase no coinciden o si tiene varias clases en el mismo archivo. Visual Studio también fomenta la relación clase-archivo (piense en diagramas de clase que crean archivos para usted, o cuando cambia el nombre del archivo .cs, Visual Studio le pregunta si desea refactorizar el nombre de la clase también).
Arseni Mourzenko
En un lenguaje compilado de estilo antiguo, el enlazador encuentra todas las referencias y símbolos externos. Pero Java no está vinculado; puede cargar frascos en tiempo de ejecución si lo desea. Sin un paso de enlace, tratar de asignar nombres de clase a ubicaciones en el classpath es mucho más rápido si sabe qué nombre de archivo debe buscar.
Paul Tomblin
44
@gahooa no es un artefacto de diseño, es una decisión de diseño deliberada. Esto hace que muchas cosas sean mucho más fáciles.
1
¿Qué pasa con el uso de grep ?
usuario

Respuestas:

19

En uno de sus boletines de especialistas en Java, Heinz Kabutz analiza las especificaciones del lenguaje Oak . El escribe:

¿Por qué cada clase pública está en un archivo separado? (Sección 1)

Esta es una pregunta que frecuentemente me han hecho durante mis cursos. Hasta ahora no he tenido una buena respuesta a esta pregunta. En la sección 1, leemos: "Aunque cada unidad de compilación de Oak puede contener múltiples clases o interfaces, como máximo una clase o interfaz por unidad de compilación puede ser pública".

En la barra lateral explica por qué: "Esta compilación aún no aplica esta restricción, aunque es necesaria para la importación eficiente de paquetes"

Es bastante obvio, como la mayoría de las cosas son una vez que conoces las razones de diseño, el compilador tendría que hacer un pase adicional a través de todas las unidades de compilación (archivos .java) para descubrir qué clases estaban donde, y eso haría la compilación aún más lenta .

http://www.javaspecialists.eu/archive/Issue055.html

Landei
fuente
1
¿Hacer compilar marginalmente más rápido? De Verdad? ¿No porque hace que tu código sea mucho más organizado? Dudo mucho que esta sea la respuesta correcta.
BlueRaja - Danny Pflughoeft
1
@ BlueRaja-DannyPflughoeft En 1998, estoy seguro de que marcó una diferencia mucho mayor
TheLQ
8

Razones por las que puedo pensar

  • Hace que encontrar otras clases sea un poco más fácil para el compilador al principio, ya que no tiene que buscar todos los miles de archivos de clase para una clase pública aleatoria, solo puede ir al archivo.
    • Esto probablemente ya no importa, pero acaba de comenzar la convención temprana que nunca cambió
  • En la compilación, un cambio en un archivo solo afecta a ese archivo. Si hay varias clases, entonces todo debe ser recompilado
  • Práctica recomendada: tener varias clases públicas en el mismo archivo hace que las cosas sean confusas. El propósito de los archivos es organizar el código fuente, el propósito de las carpetas es organizar los archivos. Si todas las clases de un paquete en particular están en un solo super archivo de 100 MB, entonces ha perdido todas las ventajas y no ha obtenido ninguno de los beneficios de los archivos (además de agregar mucho dolor de cabeza al editar)
TheLQ
fuente
1
Las clases y las interfaces no representan necesariamente el nivel más natural de subdivisiones para el código fuente. Tener muchos miles de líneas de código englobadas en un archivo es inconveniente, pero también lo es tener o no tener 100 líneas de contenido "real" (excluyendo comentarios o directivas de compilación duplicadas) distribuidas entre una docena de archivos fuente. Me pregunto cómo funcionaría si un archivo llamado así por el tipo tenía que o bien contener la definición o bien identificar el archivo que hace?
supercat