Saya memiliki pertanyaan yang tidak saya temukan jawabannya kecuali jawaban berikut yang tidak memenuhi persyaratan saya:
"Karena James Gosling tidak mau"
Saya tahu bahwa Java dapat memiliki antarmuka (hanya fungsi virtual murni, tanpa atribut), tetapi itu tidak sama persis dengan definisi kelas.
Jawaban:
Tapi itu jawaban yang tepat. Tim desain bahasa (Gosling, Sheridan, Naughton, kemudian Bill Joy, Ken Arnold, dll) memutuskan header menyebabkan lebih banyak masalah daripada yang mereka pecahkan . Jadi mereka mendesainnya, dan menunjukkan bahwa mereka dapat membuat bahasa yang sangat berguna tanpa membutuhkannya.
Dari Bagian 2.2.1 buku putih Lingkungan Bahasa Jawa :
Definisi berlebihan, menyimpan file dalam sinkronisasi, definisi yang saling bertentangan, definisi tersembunyi - tidak ada yang terjadi di Jawa, karena Anda tidak memiliki header. Jika Anda ingin melihat definisi kelas telanjang, Anda dapat menghasilkan satu dari file .java secara langsung - misalnya sebagian besar IDE akan menunjukkan kepada Anda struktur kelas di bilah sisi, yang sama dengan hal yang sama.
sumber
Tidak ada kebutuhan nyata dalam C ++ untuk memiliki definisi dan deklarasi kelas dalam file yang terpisah. Ini hanya berarti bahwa Anda dapat, setidaknya kembali pada hari C, melakukan parse dalam pemindaian atas-bawah tunggal kode. Pada mesin tanpa penyimpanan akses acak ini adalah masalah besar!
Memiliki tajuk juga memungkinkan Anda untuk menerbitkan antarmuka ke pustaka kode Anda dengan memasok tajuk tanpa perlu mengungkapkan kode sumber. Sayangnya di C ++ Anda juga harus mengungkapkan anggota data pribadi yang telah mengarah ke solusi seperti horor jerawat .
Ada upaya untuk membuat lingkungan C ++ di mana semuanya disimpan dalam struktur tipe database dan tidak ada file tetapi tidak berhasil.
sumber
Karena prinsip KERING . Di Jawa, informasi yang diperlukan untuk menggunakan kelas dalam suatu paket (atau kelas) terkandung di dalam file .class. Membuat file header terpisah yang berisi informasi yang sama akan melibatkan pengulangan di dua tempat.
sumber
Dalam setiap bahasa - ada dua tahap untuk membuat kode biner akhir - kompilasi dan penautan (tentu saja, ada pemuatan tetapi itu tidak banyak berdampak di sini). Pada saat kompilasi, seseorang hanya perlu menempatkan kait (spesifikasi fungsi yang akan dipanggil) di tempat yang tepat. Linker sebenarnya bergabung mereka ketika kedua kode nyata tersedia. Sejauh ini tidak ada perbedaan antara C ++ dan Java.
Ada adalah , bagaimanapun, kebutuhan untuk C ++ untuk memiliki deklarasi dan definisi yang terpisah. Jika Anda menyimpan implementasinya di header, dan jika file header berubah, kode yang terhubung dengannya perlu dikompilasi ulang. Di mana seolah-olah definisi dalam file terpisah, kode hanya perlu dihubungkan kembali.
Memahami bahwa C ++ memang memiliki opsi untuk memiliki tautan statis yang menyiratkan bahwa kode objek diperbaiki bersama dengan aplikasi panggilan. Harap dicatat bahwa baik di C dan C ++, tidak valid untuk memiliki pemrograman dalam file header atau bahkan melakukan #include. itu hanya berarti bahwa Anda perlu repot tentang bagaimana menghubungkan terjadi dengan file objek ini.
Situasi di Jawa sangat berbeda. Setiap file kelas dikompilasi dengan file .class. Memang, kebutuhan untuk kompilasi fungsi kelas pemanggil yang disajikan sebagai bagian header dalam file .class. Namun, dalam Java final linking hanya dilakukan di dalam Runtime (mesin virtual) hanya dengan memberikan spesifikasi kode byte file kelas itu.
Lihat ini dan ini
sumber
Secara efektif antarmuka dan termasuk adalah header; definisi itu identik dengan binari, dan tidak bisa tidak selaras. Ini adalah salah satu keputusan desain terbaik di Jawa, tetapi ini adalah gangguan kecil karena tidak ada cara untuk menggabungkan deklarasi ini untuk kekompakan dan konsistensi.
sumber
Salah satu alasan yang baik untuk menyertakan adalah untuk memisahkan kode yang mungkin ingin Anda gunakan kembali (seperti definisi umum) dari kode yang khusus untuk proyek tertentu. Java ingin Anda menentukan hanya satu kelas atau antarmuka per file dan yang sebagian besar mengurangi kebutuhan untuk header yang disertakan - karena Anda akan memiliki bagian bersama yang sudah ada dalam file mereka sendiri.
Juga, kompiler dan sistem pembangunan mungkin ingin men-cache header yang sudah dikompilasi untuk menghindari penguraian lebih dari satu kali.
sumber