Konten paket
Isi paket harus dirancang dengan cermat sehingga mereka hanya menyertakan kelas dan antarmuka yang relevan secara fungsional. Kelas dalam paket dapat dengan bebas mengakses anggota non-pribadi dari kelas lain dalam paket, dan beberapa kelas bahkan mungkin memiliki izin yang cukup untuk mengakses rincian internal kelas lain. Untuk menghindari kelas seperti itu dari anggota kelas yang salah, kita perlu melindungi anggota kelas. Setiap anggota yang tidak dinyatakan sebagai pribadi dapat diakses oleh semua jenis lain dalam paket yang sama, sehingga setiap kelas yang tidak terkait mungkin lebih cenderung lebih terkoordinasi daripada yang kita harapkan.
Paket juga menyediakan pengelompokan logis untuk programmer yang mencari antarmuka dan kelas yang berguna. Paket yang terdiri dari kelas yang tidak relevan menyulitkan pemrogram untuk mengetahui antarmuka dan kelas mana yang berguna, dan pengelompokan kelas yang logis dapat membantu pemrogram menggunakan kembali kode karena pemrogram dapat menemukan apa yang mereka butuhkan dengan lebih mudah melalui pengelompokan logis. Jika paket hanya berisi set tipe terkait yang erat, itu berarti bahwa kita dapat memberikan tipe beberapa nama yang lebih intuitif untuk menghindari konflik nama.
Paket bisa bersarang. Misalnya, java.lang adalah paket bersarang di mana paket lang bersarang dalam paket java yang lebih besar, sedangkan paket j ava juga berisi beberapa paket lainnya. Nesting membuat paket terkait membentuk sistem penamaan dengan struktur hierarkis.
Misalnya, untuk membuat serangkaian paket untuk sistem adaptif seperti jaringan saraf dan algoritma genetika, kami dapat menyebutkan nama paket dengan nama yang dipisahkan dot untuk membuat paket bersarang:
paket adaptif. jaring saraf;
File sumber yang berisi pernyataan deklarasi di atas terletak di paket adaptif.neuralnet, dan paket adaptif.neuralnet itu sendiri adalah subpackage dari paket adaptif. Paket adaptif mungkin berisi beberapa kelas yang terkait dengan algoritma adaptif umum, seperti kelas pernyataan masalah generalisasi atau kelas benchmark. Paket yang berada dalam posisi yang lebih dalam dalam hierarki (misalnya adaptif.neu-ralnet atau adaptif.genetic) berisi kelas yang terkait dengan jenis algoritma adaptif tertentu.
Sarang paket hanyalah alat untuk mengatur paket terkait, dan tidak memberikan hak akses khusus antar paket.
Kode kelas dalam paket adaptif. Paket genetik tidak dapat mengakses anggota dalam paket adaptif atau adaptif.neuralnet yang memiliki hak akses paket, dan ruang lingkup paket hanya berlaku untuk paket tertentu. Sarang paket dapat mengelompokkan paket yang relevan dan membantu pemrogram menemukan kelas yang diinginkan di tingkat logis lebih nyaman, tetapi di luar itu, itu tidak membawa manfaat lain.
Catatan paket
Paket ini juga dapat memiliki anotasi. Tetapi masalahnya adalah karena paket adalah struktur organisasi dan tidak memiliki entitas kode sumber dan mereka tidak memiliki definisi aktual, mereka tidak dapat dijelaskan seperti kelas atau metode. Oleh karena itu, anotasi paket hanya dapat dicapai dengan memberi anotasi pernyataan deklarasi paket dalam file sumber. Namun, hanya ada satu deklarasi paket di setiap paket yang dapat memiliki anotasi yang bertindak di atasnya.
Jadi, bagaimana Anda membuat anotasi paket? Faktanya, Java tidak memaksa programmer untuk menggunakan beberapa cara untuk menangani aturan "pernyataan paket beranotasi tunggal". Cara yang disarankan adalah dengan membuat file bernama paket-i nfo.java di direktori paket, di mana hanya pernyataan paket dan anotasi paket yang disimpan tanpa menempatkan yang lain. Misalnya, file package info.java untuk paket attr terlihat seperti ini:
@PackageSpec (nama dua "proyek attr", version = "1.0" @developmentite ("attr.project.org") @DevelopmentModel ("open-source") Paket ATTR;PackageSpec, Developmentite dan pengembangan OpmentModel digunakan untuk memodifikasi jenis anotasi. Tentu saja, mereka memiliki strategi penghematan runtime. File paket-info.java harus dikompilasi dengan file sumber lain dalam paket.
Kami merekomendasikan menempatkan semua informasi terkait paket dalam file package-info.java. Jika Anda melakukan ini, Anda dapat menempatkan komentar dokumen di awal file, sehingga dokumen -dokumen ini dijelaskan sebagai dokumen paket.
Paket objek dan spesifikasi
Paket biasanya menerapkan beberapa spesifikasi, dan biasanya dari suatu organisasi. Objek paket berbeda dari jenis refleksi lain dan tidak dapat digunakan untuk membuat atau mengoperasikan paket, tetapi hanya dapat berfungsi sebagai basis pengetahuan untuk memberikan informasi, yang memberikan informasi tentang spesifikasi yang diimplementasikan oleh paket (judul, vendor, dan nomor versi spesifikasi) dan informasi tentang implementasi paket itu sendiri (judul, vendor, dan nomor versi paket). Meskipun paket biasanya berasal dari organisasi individu, spesifikasi yang diterapkannya (seperti pustaka analisis statistik) dapat didefinisikan oleh organisasi lain. Program yang menggunakan paket mungkin perlu mengetahui versi spesifikasi yang diimplementasikan oleh paket, sehingga fungsi yang hanya ditentukan dalam versi tertentu dapat digunakan. Demikian pula, program -program ini mungkin juga perlu mengetahui versi implementasi mana yang disediakan untuk itu, terutama untuk menangani kemungkinan kekurangan dalam versi yang berbeda. Beberapa metode utama kelas paket memungkinkan akses ke informasi ini:
Misalnya, jika Anda mengekstrak informasi ini dari paket java.lang di sistem kami, Anda akan mendapatkan hasil berikut: '
Judul Spesifikasi: Java Platform API Spesifikasi Spesifikasi Versi: 1.4 Vendor Spesifikasi: Sun Microsystems, Inc. Judul Implementasi: Java Runtime Environment Versi Implementasi: 1.5.0_02 Implementasi Vendor: Sun Microsystems, Inc.
Nomor versi kanonik terdiri dari angka non-negatif yang dipisahkan oleh pembatas periode, seperti '' 2.0 'atau '11 .0.12'. Pola ini memungkinkan kita untuk memanggil metode ISCompatiblewith untuk membandingkan nomor versi yang mengikuti pola ini dengan nomor versi paket. Jika nomor versi paket lebih besar dari atau sama dengan nomor versi penerus, maka metode ini mengembalikan true. Perbandingan ini hanya membandingkan angka yang dipisahkan periode sekaligus. Jika salah satu dari angka -angka ini lebih kecil dari posisi yang sesuai dalam nomor versi yang diteruskan, maka kedua versi tersebut tidak kompatibel. Jika salah satu nomor versi lebih panjang dari yang lain, bagian yang hilang dalam nomor versi pendek akan dianggap nol. Misalnya, jika nomor versi kanonik paket adalah "1.4" dan kami membandingkannya dengan "1.2", "1.3.1 '. Atau" .1.81., Maka true akan dikembalikan; tetapi jika dibandingkan dengan "1.4.2 '. Atau" .5 ", maka false akan dikembalikan. Kesimpulan ini ditarik karena mekanisme perbandingan ini mengasumsikan bahwa versi spesifikasi kompatibel ke belakang.
Tidak ada format yang ditentukan untuk nomor versi implementasi, karena berbagai organisasi yang menyediakan implementasi akan menentukan versi implementasi secara berbeda. Satu -satunya perbandingan yang dapat dibuat antara versi implementasi adalah untuk menguji apakah versi tersebut sama, di mana tidak ada asumsi kompatibilitas mundur.
Paket dapat disegel, yang berarti bahwa kelas tidak dapat lagi ditambahkan ke paket. Paket yang tidak disegel dapat berisi kelas -kelas dari beberapa lokasi yang berbeda di jalur pencarian kelas, sedangkan isi paket yang disegel harus berasal dari lokasi yang sama - baik arsip tertentu atau lokasi yang ditentukan oleh URL. Ada dua cara untuk menentukan apakah suatu paket disegel:
.Public Boolean ISSEALED P: kembalikan trueo jika paket disegel
.Public Boolean Issealed (URL URL): Kembalikan true jika paket disegel untuk URL yang diberikan, yaitu, kelas dalam paket dapat dimuat dari URL yang diberikan ini. Jika kelas dalam paket tidak dapat dimuat dari URL yang diberikan, atau paket tidak disegel, maka false dikembalikan, dan spesifikasi dan informasi implementasi paket biasanya disediakan sebagai bagian dari file manifes yang disimpan dengan paket - misalnya sebagai bagian dari file manifes dalam arsip Java (JAR), seperti dijelaskan dalam bagian 25.9.2, “Archive File JAr.J.J.Jo.Jo.Jo.J. Ketika kelas dalam suatu paket dimuat, informasi ini dibaca oleh orang tersebut. ClassLoader dapat secara dinamis mendefinisikan objek paket untuk kelas yang ingin dimuat:
Kita dapat memanggil metode getPackage dari objek kelas dari kelas yang diberikan untuk mendapatkan objek paket kelas ini. Kami juga dapat menghubungi paket statis.getPackage dengan nama paket yang diberikan untuk mendapatkan objek paket, atau menghubungi paket statis.getPackages, yang akan mengembalikan array paket yang terdiri dari semua paket yang saat ini diketahui oleh class loader. Kedua metode ini terkait dengan loader kelas yang memanggil kode mereka, karena kode-kode ini akan memanggil metode get-package atau getPackages dari loader kelas mereka. Metode loader kelas ini akan mencari loader kelas tertentu dan semua loader kelas induknya, dan jika tidak ada pengaturan yang dibuat untuk loader kelas saat ini, loader kelas sistem akan digunakan saat ini. Perhatikan bahwa jika paket tidak diketahui, metode ClassLoader akan mengembalikan NULL karena tidak ada jenis dalam paket yang telah dimuat saat ini.