javac no prohíbe activamente este, pero tiene una limitación que significa que nunca querrá referirse a una clase de nivel superior desde otro archivo a menos que tenga el mismo nombre que el archivo.
Supongamos que tiene dos archivos, Foo .java y Bar.java.
Foo.java contiene:
Bar.java contiene:
- public class Bar
- clase Baz
Digamos también que todas las clases están en el mismo paquete (y los archivos están en el mismo directorio).
¿Qué sucede si Foo.java se refiere a Baz pero no a Bar e intentamos compilar Foo.java? La compilación falla con un error como este:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Esto tiene sentido si lo piensas bien. Si Foo.java se refiere a Baz, pero no hay Baz.java (o Baz.class), ¿cómo puede javac saber qué archivo fuente buscar?
Si en su lugar le dice a javac que compile Foo.java y Bar.java al mismo tiempo, o incluso si compiló previamente Bar.java (dejando la clase Baz donde javac puede encontrarla), este error desaparece . Sin embargo, esto hace que el proceso de creación se sienta muy inestable y escamoso.
Porque la limitación real, que es más como "no se refiere a una clase de nivel superior de otro archivo a menos que tenga el mismo nombre que el archivo o también se refiere a una clase que está en ese el mismo archivo que recibe el mismo nombre que el archivo "es un poco difícil de seguir, la gente generalmente sigue la convención mucho más directa (aunque más estricta) de simplemente poner una clase de nivel superior en cada archivo. Esto también es mejor si alguna vez cambia de opinión sobre si una clase debe ser pública o no.
A veces realmente hay una buena razón por la que todo el mundo hace algo de una manera particular.
+1 Buenas preguntas. Realmente nunca he pensado mucho sobre el asunto, ya que casi nunca es necesario hacerlo. –
tenga en cuenta que esta es una característica vestigial ; nunca hubiera sido posible si Java hubiera tenido clases anidadas desde el principio. –