Mengapa file sumber Java mengandung nama kelas publik yang dikandungnya?

14

Saya seorang pemula yang belajar Java. Di Jawa setiap file sumber harus mengandung kelas publik dan file sumber itu harus memiliki nama yang sama dengan kelas publik itu. Selain itu, tidak ada file sumber yang dapat berisi dua kelas publik. Mengapa pembatasan ini?

pengguna
sumber
4
Tanpa spesifik, ini adalah artefak desain sejarah dari cara Jawa direkayasa. Bahasa yang lebih baru dirancang, seperti C #, sementara mirip dengan Java, tidak memiliki batasan ini.
gahooa
13
Bukankah ini untuk menegakkan praktik terbaik? Saya pikir ini adalah satu-satunya alasan. Di C #, Anda tidak memiliki batasan ini pada tingkat teknis, tetapi masih StyleCop akan mengeluh jika nama file dan nama kelas tidak cocok atau jika Anda memiliki beberapa kelas di file yang sama. Visual Studio juga sangat mendorong hubungan kelas-file (pikirkan diagram kelas yang membuat file untuk Anda, atau ketika Anda mengganti nama file .cs, Visual Studio bertanya apakah Anda ingin refactor nama kelas juga).
Arseni Mourzenko
Dalam bahasa yang dikompilasi gaya lama, linker menemukan semua referensi dan simbol eksternal. Tapi Java tidak tertaut - Anda bisa memuat guci saat dijalankan jika diinginkan. Tanpa langkah tautan, mencoba memetakan nama kelas ke lokasi di classpath jauh lebih cepat jika Anda tahu nama file apa yang harus dicari.
Paul Tomblin
4
@ Wahooa itu bukan artefak desain, itu adalah keputusan desain yang disengaja. Ini membuat banyak hal lebih mudah.
1
Bagaimana dengan menggunakan grep ?
pengguna

Jawaban:

19

Dalam salah satu Newsletter Spesialis Jawa-nya, Heinz Kabutz menggali Spesifikasi Bahasa Oak . Dia menulis:

Mengapa setiap kelas publik di file terpisah? (Bagian 1)

Ini adalah pertanyaan yang sering saya tanyakan selama kursus. Sampai sekarang saya belum memiliki jawaban yang bagus untuk pertanyaan ini. Di bagian 1, kita membaca: "Meskipun setiap unit kompilasi Oak dapat berisi beberapa kelas atau antarmuka, paling banyak satu kelas atau antarmuka per unit kompilasi dapat menjadi publik".

Di bilah sisi menjelaskan mengapa: "Pembatasan ini belum diberlakukan oleh kompiler, meskipun itu diperlukan untuk impor paket yang efisien"

Ini cukup jelas - seperti kebanyakan hal yang pernah Anda tahu alasan desain - kompiler harus membuat tambahan melewati semua unit kompilasi (file .java) untuk mencari tahu kelas apa yang ada di mana, dan itu akan membuat kompilasi bahkan lebih lambat .

http://www.javaspecialists.eu/archive/Issue055.html

Landei
sumber
1
Untuk membuat kompilasi sedikit lebih cepat? Betulkah? Bukan karena itu membuat kode Anda jauh lebih teratur? Saya sangat ragu ini adalah jawaban yang benar.
BlueRaja - Danny Pflughoeft
1
@ BlueRaja-DannyPflughoeft Pada tahun 1998, saya yakin itu membuat perbedaan yang jauh lebih besar
TheLQ
8

Alasan yang bisa saya pikirkan

  • Membuat menemukan kelas-kelas lain sedikit lebih mudah untuk kompiler di awal karena tidak harus mencari semua berpotensi ribuan file kelas untuk kelas publik acak, hanya bisa pergi ke file.
    • Ini mungkin tidak masalah lagi tetapi baru memulai kebaktian awal yang tidak pernah berubah
  • Dalam kompilasi, perubahan ke file hanya memengaruhi file itu. Jika ada beberapa kelas maka semuanya harus dikompilasi ulang
  • Praktik terbaik - Memiliki beberapa kelas publik dalam file yang sama membuat hal-hal membingungkan. Tujuan file adalah untuk mengatur kode sumber, tujuan folder adalah untuk mengatur file. Jika semua kelas dari paket tertentu berada dalam satu file super 100 MB, maka Anda telah kehilangan semua kelebihannya dan tidak mendapatkan manfaat dari file tersebut (ditambah menambahkan banyak sakit kepala saat mengedit)
TheLQ
sumber
1
Kelas dan antarmuka tidak selalu mewakili tingkat subdivisi paling alami untuk kode sumber. Memiliki ribuan baris kode yang digelapkan menjadi satu file tidak nyaman, tetapi demikian juga memiliki 100 baris konten "nyata" (tidak termasuk komentar atau arahan kompilator duplikat) menyebar di antara selusin file sumber. Aku bertanya-tanya bagaimana hal itu akan bekerja jika sebuah file bernama untuk jenis harus baik mengandung definisi atau mengidentifikasi file yang tidak?
supercat