2010-08-26 28 views
43

En cualquier archivo Java, ¿por qué solo podemos tener una clase pública cuyo nombre sea el mismo que el nombre del archivo Java?Por qué solo 1 clase pública en el archivo Java

+45

** Porque [él] (http://en.wikipedia.org/wiki/James_Gosling) lo dijo !! ** – jjnguy

+2

Para permitir al compilador encontrar fácilmente la definición de la clase. Es más fácil compilar de esa manera. No tengo una referencia (es por eso que este es un comentario) pero creo que las respuestas a continuación apuntan a eso. – OscarRyz

+1

En otras palabras, invente su propio lenguaje de programación si no está de acuerdo :) – BalusC

Respuesta

15

Según this source, corresponde a la compilación eficiente:

En la barra lateral que explica por qué: "Esta restricción aún no se hace cumplir por el compilador, aunque es necesario para importación paquete eficiente"

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

Lo mismo se aplica también a las importaciones de archivos fuente en IDEs. Otra razón sería tamaños de fuente razonables.

22

Obliga a todo el código Java para ser organizada de una manera determinada, que a la larga ayuda a mejorar la legibilidad del código .

Los diseñadores de Java eligieron un enfoque estricto que refuerza su idea de buenas prácticas de diseño, y esto es parte de ese tema. Contraste eso con la actitud de "todo vale" en Perl.

+1

+1, totalmente de acuerdo, demonios, extraño esto en C#. Incluso si siempre utilizo un archivo separado para cada clase/enum/struct, he visto cosas horribles :-) –

+3

Debe ser aún más estricto y también se aplica a las clases no públicas. La mayoría de las personas lo hace de la manera correcta, pero algunos aún logran hacer un lío colocando muchas clases visibles predeterminadas en un solo archivo. – starblue

+1

¿Tiene alguna cita para respaldar la afirmación de que la legibilidad del código fue la razón por la cual los diseñadores eligieron esta restricción? – Rohit

8

Estas son las reglas. Aunque no es del todo cierto. Se pueden definir clases internas dentro de ti la clase "principal" de esta manera:

public class A { 
    public class B { 
     ... 
    } 
} 
+2

mismo válido para las clases de nivel superior no público –

0

Se permite una búsqueda más eficiente de la fuente (.java ) y los archivos compilados (.class) durante la compilación (directiva de importación) y una una carga de clases más eficiente durante la ejecución. La idea es: si conoce el nombre de una clase, ya sabe dónde se encuentra para cada entrada de classpath. No se requiere indexación.

+0

Error sobre la carga de clase de tiempo de ejecución. Si tengo un archivo X.java que contiene la clase pública X y la clase no pública Y, entonces el compilador creará dos archivos, X.class e Y.class.Al cargador de clases no le importa si las clases son públicas y no tiene forma de saber si provienen del mismo archivo. –

+0

Esto no afecta el rendimiento de búsqueda del cargador de clases. Una vez compilado, no es relevante saber de qué archivo fuente proviene la clase. Para el compilador, sin embargo, una referencia a la clase Y aún no compilada obligará al compilador a examinar cada archivo * .java dentro del paquete actual (normalmente, todos los archivos fuente del directorio del paquete). Eso es más bien un detalle menor. – gawi

1

Java utiliza esta convención para encontrar el bytecode de clase/interfaz comenzando en classpath y buscando la jerarquía del paquete en los subdirectorios. La representación del sistema de archivos de esta jerarquía también impone algunas reglas básicas.

  1. Cualquier dos clases de Java o interfaces en el mismo paquete no pueden tener el mismo nombre . Los nombres de archivo serían conflicto .
  2. Cualquiera de los dos paquetes Java en el mismo paquete primario no pudo tienen el mismo nombre. Las rutas de carpeta entrarán en conflicto.
  3. Una clase tiene visibilidad para todas las clases en el mismo paquete sin modificación en el classpath.
3

Cortesía del Dr. Heinz Kabutz y su excelente newsletter ....

¿Por qué es cada una clase pública en un archivo separado ?

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

En la barra lateral que explica por qué: "Esta restricción aún no se hace cumplir por el compilador, aunque es necesario para eficiente importación paquete"

Es bastante obvio - como la mayoría de las cosas son una vez que conozca el razones de diseño - el compilador tendría que hacer una pase adicional a través de todas las unidades de compilación (archivos .java) a averiguar cuáles eran las clases donde, y que haría que la compilación aún más lento.

2

Podemos tener solo un nivel superior de clase pública o interfaz en cualquier unidad de compilación java (archivo fuente .java).

Pero puede haber cualquier cantidad de clases/interfaces predeterminadas por archivo src.

qué:

JLS deja la opción al compilador de Java. Y la mayoría de las implementaciones del compilador obliga a tener nombre de archivo de la misma como:

(1) la clase pública/interfaz de nombre

(2) si hay un método principal y ninguna clase pública entonces cualquier nombre

(3) Si hay un método principal y una clase pública, entonces el método principal debe estar en esa clase pública

(4) si no hay clase pública ni método principal, entonces cualquier nombre válido que pueda coincidir o no con los nombres de clase/interfaz en el archivo.

De (2): Si se permiten dos clases públicas, deberíamos dar dos nombres al archivo, lo cual es terriblemente insignificante para el sistema de archivos. De (3): si se permiten dos clases públicas, deberíamos tener dos métodos principales que son terriblemente insignificantes para java

Por lo tanto, un archivo fuente Java puede tener una única clase pública.

Creo que los 4 puntos anteriores son forzados por el compilador a hacer que tanto el compilador como el jvm encuentren un archivo fuente o un archivo de clase java sencillo para la compilación/carga/vinculación. Java tiene tales restricciones integradas que los desarrolladores deben seguir para tener una mejor programación.

Fuente: Mis lecturas y comprensión.

0

Creo que esta puede ser una razón posible. Puede haber solo una clase pública en un archivo java porque el nombre del archivo java es el mismo que el nombre de la clase pública. Y obviamente no podemos tener un archivo con dos nombres diferentes.

0

Para tener un entendimiento entre el compilador y el programador. Es una regla que el código fuente debe tener casi una clase pública y esa clase debe contener la función principal.Así sin ninguna confusión/restricción al que el compilador puede acceder (público) la clase y el nombre del nombre de clase para el archivo de clase. También dado que esta clase contiene el main(), la ejecución del archivo de clase dará el flujo correcto

1

Para entender la razón básica detrás de estas restricciones, supongamos que el compilador no lo hace dar error de compilación por no nombrar el nombre del archivo igual que el nombre de la clase pública.

Supongamos que hay un paquete A file1.java

 A 
    / \ 
file1.java file2.java 

package A; 

class file1 
{ 
    public static void main(String args[]) 
    { 

    } 
} 

public class file3 
{ 
public static void main(String args[]) 
{ 

} 
} 

Ahora, como sabemos que una clase pública también se puede acceder fuera del paquete, ahora se convertirá en el responsabilidad de un desarrollador para que sea accesible al mundo exterior. Veamos cómo:

Supongamos que el paquete A contiene solo archivos Java (sin archivos de clase) y alguna clase fuera del paquete A intenta acceder a la clase pública file3, el compilador primero intentará encontrar file3.class (no disponible), luego intentará encontrar file3.java (no disponible). Entonces, aunque la clase file3 es de naturaleza pública, no es visible para el mundo exterior. Entonces, si un compilador pone la restricción de que si un archivo contiene clase pública, debería llamarse igual que el nombre de clase pública, entonces el problema anterior se puede resolver y el desarrollador no tendrá que pensar en exponer la clase pública al mundo exterior .

El compilador también establece la restricción de que debe haber casi una clase pública por archivo Java, de modo que el mundo exterior pueda acceder a cada clase pública.

Cuestiones relacionadas