javac tidak secara aktif melarang ini, tetapi ia memiliki batasan yang cukup banyak berarti bahwa Anda tidak akan pernah ingin merujuk ke kelas tingkat atas dari file lain kecuali ia memiliki nama yang sama dengan file itu.
Misalkan Anda memiliki dua file, Foo.java dan Bar.java.
Foo.java berisi:
Bar.java berisi:
- Bar kelas publik
- kelas Baz
Katakan juga bahwa semua kelas berada dalam paket yang sama (dan file-file tersebut di direktori yang sama).
Apa yang terjadi jika Foo.java merujuk ke Baz tetapi bukan Bar dan kami mencoba untuk mengkompilasi Foo.java? Kompilasi gagal dengan kesalahan seperti ini:
Foo.java:2: cannot find symbol
symbol : class Baz
location: class Foo
private Baz baz;
^
1 error
Ini masuk akal jika Anda memikirkannya. Jika Foo.java merujuk ke Baz, tetapi tidak ada Baz.java (atau Baz.class), bagaimana bisa javac tahu file sumber apa yang harus dicari?
Jika Anda sebaliknya memberitahu javac untuk mengkompilasi Foo.java dan Bar.java pada saat yang sama, atau bahkan jika Anda sebelumnya telah mengkompilasi Bar.java (meninggalkan Baz.class di mana javac dapat menemukannya) maka kesalahan ini hilang. Ini membuat proses pembuatan Anda terasa sangat tidak bisa diandalkan dan serpihan.
Karena batasan sebenarnya, yang lebih mirip "jangan merujuk ke kelas tingkat atas dari file lain kecuali jika itu memiliki nama yang sama dengan file itu atau Anda juga merujuk ke kelas yang ada di file yang sama yang bernama hal yang sama seperti file "agak sulit untuk diikuti, orang biasanya pergi dengan konvensi yang jauh lebih mudah (walaupun lebih keras) hanya menempatkan satu kelas tingkat atas di setiap file. Ini juga lebih baik jika Anda pernah berubah pikiran tentang apakah suatu kelas harus umum atau tidak.
Terkadang memang ada alasan bagus mengapa semua orang melakukan sesuatu dengan cara tertentu.