Java 9 akan memiliki modul selain paket. Biasanya bahasa memiliki satu atau yang lain. Dan sebagian besar programmer menganggap dua istilah sebagai sinonim. Modul dibangun di atas paket, memperlakukannya sebagai primitif. Pola komposit menyarankan untuk memperlakukan primitif dan komposit secara seragam. Kalau tidak, hal-hal buruk akan terjadi. Misalnya, lihat proyek Valhalla, di mana mereka mencoba untuk menyesuaikan jenis umum untuk tipe primitif (nilai) dan referensi.
Apakah modul dan paket mewakili gagasan yang terpisah secara semantik? Berarti masuk akal memiliki keduanya untuk bahasa apa pun (pemisahan kekhawatiran). Atau Java harus memiliki keduanya sebagai penghargaan untuk kompatibilitas?
Mengapa memperkenalkan konsep baru alih-alih menambah yang sudah ada?
JSR 376 : "sistem modul platform Java" diimplementasikan dalam Jigsaw proyek .
Menurut SOTMS
Modul adalah kumpulan kode dan data yang diberi nama dan menggambarkan dirinya sendiri. Kodenya diatur sebagai seperangkat paket yang berisi tipe, yaitu kelas dan antarmuka Java; datanya mencakup sumber daya dan jenis informasi statis lainnya.
JLS dengan hati-hati menghindari mendefinisikan apa itu paket . Dari Wikipedia :
Paket Java adalah teknik untuk mengatur kelas Java ke dalam ruang nama yang mirip dengan modul Modula, menyediakan pemrograman modular di Jawa.
Saya tahu bahwa mengutip Wikipedia adalah praktik yang buruk, tetapi mencerminkan pemahaman bersama. Dari entri pada pemrograman modular:
Paket istilah kadang-kadang digunakan sebagai ganti modul (seperti di Dart, Go, atau Java). Dalam implementasi lain, ini adalah konsep yang berbeda; dalam Python paket adalah kumpulan modul, sementara di Java 9 yang akan datang diperkenalkan konsep modul baru (kumpulan paket dengan kontrol akses yang ditingkatkan) direncanakan.
sumber
jigsaw
modul-gaya hanya peningkatan teknis atas paket? 3) (jika bukan 1 dan jika 2), Java sederhana (atau tampaknya) menjaga kedua konsep untuk kompatibilitas mundur. Beberapa dari pertanyaan ini dapat dijawab, beberapa di antaranya berorientasi pada pendapat. Saya pikir suntingan yang menyederhanakan klarifikasi yang dicari ada di sini.package
/ tidak / berarti, juga tidak akan berubah menjadi (mari kita hadapi itu, cukup mengerikan) sistem classpath di JRE. Pertanyaan # 2 Saya merasa terutama berorientasi pada pendapat (itu bisa dijawab , tetapi jawaban saya dan orang lain mungkin berbeda dan kita berdua tidak akan salah).Jawaban:
The Konsep dari modul berbeda dari Instansiasi konsep itu.
Java selalu memiliki modul. Metode adalah modul, begitu juga kelas dan juga paket. Modul adalah unit organisasi di mana detail internal disembunyikan, dan yang berkomunikasi dengan modul lain melalui kontrak yang disepakati. Sebagai contoh, metode adalah modul karena memiliki internal tersembunyi (kode dan variabel lokal) dan kontrak (parameter dan tipe pengembalian). Modul dapat terdiri dari modul tingkat lebih rendah, misalnya kelas berisi metode.
Apa yang hilang pada Java inti (pra-9) adalah modul yang dapat digunakan . Semua jenis modul di atas bukanlah unit yang dapat digunakan yang dapat disalin. Java memang memiliki artefak yang dapat digunakan yang disebut file JAR, tetapi ini bukan modul karena mereka tidak memiliki enkapsulasi atau kontrak: pada saat runtime file JAR menghilang, semua digabung menjadi satu "classpath".
OSGi membahas kurangnya modul yang dapat digunakan pada tahun 1998 dengan konsep "bundel". Ini adalah file JAR secara fisik dan mengandung paket, tetapi OSGi mendefinisikan metadata tambahan bersama dengan sistem runtime untuk mendukung enkapsulasi dan kontrak pada tingkat itu.
Java 9 mengatasi kurangnya modul yang dapat digunakan dalam cara yang mirip dengan OSGi. Bisa dibilang ini sama sekali tidak perlu karena OSGi ada dan berfungsi, tapi itu diskusi yang sangat berbeda ...
Sayangnya Java 9 merusak perairan dengan menamai konsep modul baru hanya "modul". Ini tidak berarti bahwa metode, kelas dan paket berhenti menjadi modul! "Modul" J9 hanyalah contoh lain dari konsep modul . Seperti bundel OSGi, modul J9 terbuat dari paket dan merupakan artefak fisik (biasanya file JAR lagi) yang dapat disalin. Sistem runtime memahami dan menerimanya.
Rangkuman: ya modul dan paket J9 adalah gagasan yang terpisah secara semantik. Jelas Java harus mempertahankan konsep paket yang ada untuk kompatibilitas mundur. Perhatikan bahwa kata "paket" digunakan cukup berbeda di Jawa daripada di bahasa lain atau dalam sistem manajemen paket seperti RPM. Modul J9 baru (dan bundel OSGi) jauh lebih mirip paket dalam RPM daripada paket Java sebelumnya.
sumber
import
bisa pasangan paket. Tetapi tidak ada cara untuk menyusun paket sebagai warga negara kelas satu. Kekurangan-kekurangan itu (dan keterbatasan OSGi) dijelaskan dalam JSR 376.Biarkan saya bahaya pada jawaban, meskipun sebagian besar mungkin asumsi / membelah rambut / ocehan, dll.
Apakah mereka sama? Nah, ya dan tidak ada
Dari artikel JavaWorld ini tentang "Modularity in Java 9" :
Seperti @ user2418306 (OP) mengisyaratkan, " modul adalah paket yang dilakukan dengan benar " . Modul dan paket di Java (pada Java 9, jelas) adalah (seperti yang diminta OP) secara semantik adalah hal yang sama. Yaitu, mereka adalah kumpulan bytecode JVM yang telah dikompilasi sebelumnya, dengan metadata lainnya - pada dasarnya , mereka adalah perpustakaan .
Nah apa bedanya?
Namun, perbedaannya ada pada metadata di dalam masing-masing.
package
Manifes Java , atau manifes JAR, tidak sering dikelola oleh pengembang perpustakaan, juga tidak memberikan kontrak yang pasti tentang apa yang disediakan oleh JAR / paket. Seperti yang dijelaskan di sini (artikel JavaWorld lagi) :Kata-kata kasar tentang bahasa / lingkungan lain, dll
Area lain yang dibahas dalam artikel itu adalah sistem seperti Maven , yang mengelola dependensi untuk Anda sebagai bagian dari proses pembangunan. Dari halaman ini di situs Apache Maven :
Sekarang berbicara tentang masa depan seolah-olah saya sudah ada di sana
Seperti yang disebutkan halaman itu , bahasa lain (seperti Perl), memiliki repositori paket (seperti CPAN ). Ini adalah tren yang meningkat (saya katakan karena saya merasa seperti itu, tanpa bukti tegas apa pun), selama sekitar sepuluh tahun terakhir. Alat-alat seperti permata Ruby , Python PyPi , dan manajer paket Node (
npm
) dibangun berdasarkan ini untuk menyediakan cara yang konsisten untuk mengkonfigurasi lingkungan (baik pengembangan, pembuatan, pengujian, atau runtime, dll) dengan hal-hal yang benar (paket, modul, permata, gizmo, dll). Suatu ide (saya rasa) " dipinjam " dari sistem distribusi Linux® seperti Debian's apt , RedHat'srpm
, dll. (Meskipun, jelas, telah berevolusi setidaknya satu generasi, dan menjadikan semuanya lebih baik.)Modul Java , meskipun tidak perlu menambahkan apa pun yang belum dapat Anda lakukan, menjadikan tooling untuk dependensi / manajemen paket dan lingkungan build otomatis semuanya JAUH lebih mudah. Apakah itu membuat modul "lebih baik", saya menolak untuk mengatakan. : P
sumber
classpath
danmodulepath
. Dan lompati rintangan untuk mendukung pengujian unit. Premis yang dua konsepnya setara karena mewakili koleksi hal plus metadata terlalu berani untuk saya terima. Ditambah middleway, Anda tiba-tiba mengganti stoples untuk paket.