javac nie aktywnie tego zabrania, ale ma ograniczenia, które w zasadzie oznaczają, że nigdy nie chciałbyś odwoływać się do klasy najwyższego poziomu z innego pliku, chyba że ma taką samą nazwę jak plik, w którym się znajduje.
Załóżmy, że masz dwa pliki, Foo.java i Bar.java.
Foo.java zawiera:
Bar.java zawiera:
- Bar klasy publicznej
- klasa Baz
Powiedzmy również, że wszystkie klasy są w tym samym pakiecie (a pliki znajdują się w tym samym katalogu).
Co się stanie, jeśli Foo.java odnosi się do Baz, ale nie Bar, i spróbujemy skompilować Foo.java? Kompilacja kończy się niepowodzeniem z takim błędem:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Ma to sens, jeśli się nad tym zastanowić. Jeśli Foo.java odnosi się do Baz, ale nie ma Baz.java (lub Baz.class), to w jaki sposób javac może wiedzieć, w którym pliku źródłowym szukać?
Jeśli zamiast tego powiesz javacowi, aby skompilował Foo.java i Bar.java w tym samym czasie, lub nawet jeśli wcześniej skompilowałeś Bar.java (pozostawiając Baz.class, gdzie javac może go znaleźć), to ten błąd zniknie. To sprawia, że proces kompilacji wydaje się bardzo zawodny i łuszczący się.
Ponieważ rzeczywiste ograniczenie, które jest bardziej jak „nie odnosi się do klasy najwyższego poziomu z innego pliku, chyba że ma taką samą nazwę jak plik, w którym się znajduje, lub odnosi się to również do klasy, która znajduje się w tym samym pliku o nazwie to samo, co plik „jest trochę trudny do naśladowania, ludzie zwykle stosują o wiele prostszą (choć bardziej rygorystyczną) konwencję polegającą na umieszczeniu tylko jednej klasy najwyższego poziomu w każdym pliku. Jest to również lepsze, jeśli kiedykolwiek zmienisz zdanie na temat tego, czy klasa powinna być publiczna, czy nie.
Czasami naprawdę istnieje dobry powód, dla którego każdy robi coś w określony sposób.