javac verbietet dies nicht aktiv, hat jedoch eine Einschränkung, die so ziemlich bedeutet, dass Sie niemals auf eine Klasse der obersten Ebene aus einer anderen Datei verweisen möchten, es sei denn, sie hat denselben Namen wie die Datei, in der sie sich befindet.
Angenommen, Sie haben zwei Dateien, Foo.java und Bar.java.
Foo.java enthält:
Bar.java enthält:
- öffentliche Klasse Bar
- Klasse Baz
Angenommen, alle Klassen befinden sich im selben Paket (und die Dateien befinden sich im selben Verzeichnis).
Was passiert, wenn Foo.java auf Baz, aber nicht auf Bar verweist und wir versuchen, Foo.java zu kompilieren? Die Kompilierung schlägt mit einem Fehler wie dem folgenden fehl:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Dies ist sinnvoll, wenn Sie darüber nachdenken. Wenn Foo.java auf Baz verweist, aber keine Baz.java (oder Baz.class) vorhanden ist, wie kann javac wissen, in welcher Quelldatei gesucht werden soll?
Wenn Sie stattdessen javac anweisen, Foo.java und Bar.java gleichzeitig zu kompilieren, oder wenn Sie zuvor Bar.java kompiliert haben (die Baz.class dort belassen, wo javac sie finden kann), verschwindet dieser Fehler. Dadurch fühlt sich Ihr Erstellungsprozess jedoch sehr unzuverlässig und schuppig an.
Weil die eigentliche Einschränkung eher so lautet: "Verweisen Sie nicht auf eine Klasse der obersten Ebene aus einer anderen Datei, es sei denn, sie hat denselben Namen wie die Datei, in der sie sich befindet, oder Sie beziehen sich auch auf eine Klasse, die sich in derselben Datei befindet, die benannt ist Das Gleiche wie die Datei "ist schwer zu befolgen. Die Leute gehen normalerweise mit der viel einfacheren (wenn auch strengeren) Konvention vor, nur eine Klasse der obersten Ebene in jede Datei einzufügen. Dies ist auch besser, wenn Sie jemals Ihre Meinung ändern, ob eine Klasse öffentlich sein soll oder nicht.
Manchmal gibt es wirklich einen guten Grund, warum jeder etwas auf eine bestimmte Weise tut.