Tengo una pregunta para la que no encontré una respuesta, excepto la siguiente respuesta que no cumple con mis requisitos:
"Porque James Gosling no quería"
Sé que Java puede tener interfaces (solo funciones virtuales puras, sin atributos), pero no es exactamente lo mismo que las definiciones de clase.
Respuestas:
Sin embargo, esa es la respuesta correcta. El equipo de diseño del lenguaje (Gosling, Sheridan, Naughton, luego Bill Joy, Ken Arnold, etc.) decidió que los encabezados causaron más problemas de los que resolvieron . Entonces los diseñaron y demostraron que podían crear un lenguaje perfectamente útil sin la necesidad de ellos.
Desde la Sección 2.2.1 del libro blanco del lenguaje Java Medio Ambiente :
Definiciones redundantes, mantener archivos sincronizados, definiciones conflictivas, definiciones ocultas, ninguna de estas ocurre en Java, porque no tiene encabezados. Si desea ver una definición de clase básica, puede generarla directamente desde un archivo .java; por ejemplo, la mayoría de los IDE le mostrarán la estructura de una clase en una barra lateral, lo que equivale a lo mismo.
fuente
No hay una necesidad real en C ++ de tener las definiciones de clase y declaraciones en archivos separados. Simplemente significa que usted podría, al menos en los días C, hacer el análisis en un solo escaneo de arriba a abajo del código. En máquinas sin almacenamiento de acceso aleatorio, ¡esto fue un gran problema!
Tener encabezados también le permitió publicar la interfaz en su biblioteca de códigos al proporcionar el encabezado sin necesidad de revelar el código fuente. Desafortunadamente, en C ++ también tiene que revelar los miembros de datos privados que han llevado a soluciones como el horror de Pimpl .
Ha habido intentos de crear un entorno C ++ donde todo estaba almacenado en una estructura de tipo de base de datos y no hay archivos, pero no se puso al día.
fuente
Por el principio DRY . En Java, la información necesaria para usar clases en un paquete (o clase) está contenida dentro del archivo .class. Crear archivos de encabezado separados que contengan la misma información implicaría repetirlo en dos lugares.
fuente
En cada idioma, hay dos etapas para crear el código binario final: compilar y vincular (por supuesto, hay carga, pero eso no tiene mucho impacto aquí). En el momento de la compilación, solo es necesario colocar los ganchos (la especificación de las funciones que se llamarán) en el lugar apropiado. Linker realmente se une a ellos cuando ambos códigos reales están disponibles. Hasta ahora no hay diferencia entre C ++ y Java.
Sin embargo, existe la necesidad de que C ++ tenga declaración y definición separadas. Si mantiene la implementación en el encabezado, y si el archivo del encabezado cambia, el código que está vinculado debe volver a compilarse. Donde, como si la definición estuviera en un archivo separado, el código solo necesita volver a vincularse.
Comprenda que C ++ tiene la opción de tener enlaces estáticos, lo que implica que el código objeto se arregla junto con la aplicación que realiza la llamada. Tenga en cuenta que tanto en C como en C ++, no es inválido tener programación en el archivo de encabezado o incluso hacer #include. solo significa que debe preocuparse acerca de cómo ocurre la vinculación con estos archivos de objetos.
La situación en Java es muy diferente. Cada archivo de clase se compila con el archivo .class. De hecho, la necesidad de la compilación de la función de clase de llamador que se sirve como una sección de encabezado en el archivo .class. Sin embargo, en Java el enlace final se realiza solo dentro del Runtime (la máquina virtual) solo con esa especificación del código de bytes del archivo de clase.
Mira esto y esto
fuente
Efectivamente, las interfaces e incluye son los encabezados; Por lo tanto, las definiciones son idénticas a los binarios y no pueden estar fuera de sincronización. Esta es una de las mejores decisiones de diseño en Java, pero es una molestia menor que no haya forma de agrupar estas declaraciones para lograr compacidad y consistencia.
fuente
Una buena razón para tener incluye es separar el código que desee reutilizar (como las definiciones comunes) del código específico de un proyecto determinado. Java quiere que especifique solo una clase o interfaz por archivo y eso reduce la necesidad de encabezados incluidos, ya que tendrá las partes compartidas ya en sus propios archivos.
Además, los compiladores y los sistemas de compilación pueden querer almacenar en caché los encabezados precompilados para evitar analizarlos más de una vez.
fuente