Penamaan paket
Nama paket harus menghindari konflik dengan paket lain, jadi memilih nama yang bermakna dan unik adalah aspek penting dari desain paket. Namun, pemrogram di seluruh dunia sedang mengembangkan paket, dan tidak ada cara untuk mengetahui siapa yang menggunakan nama paket apa, jadi memilih satu -satunya nama paket adalah masalah. Jika kami menentukan bahwa suatu paket hanya digunakan dalam organisasi kami, kami dapat memiliki wasit internal untuk memastikan bahwa tidak ada konflik nama antar proyek.
Tetapi bagi seluruh dunia, pendekatan ini tidak praktis. Pengidentifikasi paket adalah semua nama sederhana, dan cara yang lebih baik untuk memastikan bahwa nama paket adalah menggunakan nama domain internet. Jika perusahaan tempat kami bekerja adalah Magic.lnc dan nama domain perusahaan adalah Magic C.com, maka deklarasi paket atribut harus:
paket com.magic.attr; Perhatikan bahwa nama konstituen nama domain di sini diatur dalam urutan terbalik dari nama domain konvensional.
Jika kami mengadopsi idiom ini, nama paket yang kami gunakan tidak akan bertentangan dengan orang lain kecuali kemungkinan konflik dalam organisasi kami. Jika memang ada konflik dalam organisasi kami (mungkin perusahaan besar), maka kami dapat menggunakan nama domain yang lebih spesifik untuk memenuhi syarat lebih lanjut. Banyak perusahaan besar memiliki subdomain internal, seperti Timur dan Eropa, yang dapat digunakan untuk lebih memenuhi syarat nama paket:
paket jagung.magic.japan.attr;
Menggunakan solusi ini dapat membuat nama paket sangat lama, tetapi relatif aman. Pemrogram yang menggunakan teknik ini tidak akan memilih nama paket yang sama, dan pemrogram yang tidak menggunakan teknik ini tidak akan memilih nama yang kami gunakan.
Akses Paket
Saat menyatakan aksesibilitas kelas tingkat atas dan antarmuka tingkat atas dalam paket, ada dua opsi: akses paket (paket) dan akses publik (publik). Kelas atau antarmuka yang dimodifikasi dengan publik dapat diakses dengan kode out-of-package, sementara jenis yang tidak dihiasi dengan publik memiliki ruang lingkup paket: mereka dapat diakses dengan kode lain dalam paket yang sama; Tetapi mereka disembunyikan untuk kode out-of-package, bahkan dalam kode subpackage. Saat mendeklarasikan jenis, kita hanya boleh menyatakan jenis -jenis yang perlu digunakan oleh pemrogram lain sebagai publik, dan menyembunyikan jenis -jenis yang dimiliki oleh detail implementasi paket. Teknologi ini memberi kita fleksibilitas yang luar biasa, dan karena pemrogram tidak mengandalkan jenis detail implementasi yang tidak dapat mereka akses, kita dapat dengan bebas mengubahnya ketika kita ingin mengubah detail implementasi.
Anggota kelas yang tidak dinyatakan sebagai publik, terlindungi atau pribadi dapat diakses secara langsung dengan kode apa pun di dalam paket, tetapi disembunyikan dari luar paket. Dengan kata lain, pengubah akses default adalah "paket", dengan pengecualian anggota antarmuka, dan pengubah akses default mereka adalah "publik".
Bidang atau metode yang tidak dinyatakan pribadi dalam suatu paket dapat diakses oleh semua kode lain dalam paket itu, sehingga kelas dalam paket yang sama dianggap "ramah" atau "tepercaya". Ini memungkinkan kami untuk mendefinisikan kerangka kerja aplikasi yang menggabungkan kode yang telah ditentukan dan kode placeholder, di mana kode placeholder ditimpa oleh subclass dari kelas kerangka kerja. Kode yang telah ditentukan dapat menggunakan pengubah akses paket sehingga kode kolaboratif lain dalam paket dapat secara langsung mengaksesnya, tetapi untuk pengguna di luar paket, kode-kode ini tidak dapat diakses. Namun, subpackage dari paket di mana kode -kode ini berada tidak tepercaya dan sebaliknya. Misalnya, kode yang dimodifikasi dengan pengubah akses paket dalam paket DIT tidak dapat diakses oleh kode dalam paket anaknya dit.dat, dan sebaliknya.
Oleh karena itu, masing -masing jenis mendefinisikan tiga kontrak yang berbeda:
Metode aksesibilitas dan penutup
Hanya metode yang dapat diakses dalam superclass yang dapat ditimpa di subkelas. Jika metode dalam superclass tidak dapat diakses, metode ini tidak dapat diganti dalam subkelas bahkan jika metode dalam subkelas memiliki nama yang sama dengan metode tersebut. Ketika metode dipanggil saat runtime, sistem mempertimbangkan aksesibilitasnya dan dengan demikian menentukan implementasi mana yang sedang berjalan.
Contoh yang dibangun secara khusus dijelaskan lebih jelas. Misalkan kami mendeklarasikan kelas basis abstrak dalam paket P1:
paket p1; {AB ab abab Public Abstract Class Abstrakbase Private void pri () {print ("stractbase.pri ()"):} void pac () {print ("stractbase.pac ()");} void pro () {cetak ("cetak ("); show () pri (); Pac (); pro(); pub (); }}Di kelas ini, kami mendefinisikan 4 metode, masing -masing dengan pengubah akses yang berbeda, dan tubuh metode ini hanya mengidentifikasi dirinya sendiri. Metode ini menunjukkan panggilan 4 metode ini pada objek saat ini secara bergantian. Saat menerapkan metode ini ke berbagai objek subkelas, itu dapat menjelaskan implementasi metode ini yang disebut.
Sekarang, kami mendefinisikan Class Concretel, yang memperluas kelas AbstractBase, tetapi terletak di paket P2:
paket p2; Impor P1.ABSTRACTBASE PUBLIK PUBLIK CONCRETEL Memperluas AbstractBase {public void pri () {print ("concretel.pri ()");} public void pac () {print ("concretel.pac ()");} public void pro () {print ("concretel.pro ()"); pub () {print ("concretel.pub ()");}}4 Metode dalam superclass dirapisi ulang di kelas ini dan implementasinya diubah, yang melaporkan bahwa mereka termasuk kelas con-cretel. Pada saat yang sama, hak akses mereka telah diubah menjadi publik untuk diakses kode lain. Menjalankan kode berikut
concretel baru (). show ():
Output berikut akan dihasilkan:
AbstractBase.pri () AbstractBase.pac () CONCRETEL.PRO () CONCRETEL.PUB ()
Karena metode pribadi PRI tidak dapat diakses oleh subkelas (atau kelas lain), metode show selalu menyebut implementasi metode PRI di kelas AbstractBase. Metode PAC dengan izin akses paket di kelas AbstractBase tidak dapat diakses oleh Concretel, sehingga implementasi metode PAC di kelas Concretel tidak dapat mengganti definisi di kelas AbstractBase, sehingga metode acara menyebut metode AbstractBase.PAC. Metode Pro dan metode PUB keduanya dapat diakses di kelas Concretel dan juga dapat ditimpa, sehingga metode acara menyebut implementasi kedua metode ini di kelas Concretel.
Ikuti Kaki Kaki Kami Makna Class Concrete2 untuk memperluas Class Concretel, dan kemudian kami meletakkannya di paket yang sama P1 dengan kelas AbstractBase ':
paket p1; Impor P2.Conscretel Public Class Concrete2 Memperluas Concretel {public void pri () {print ("concrete2.pri ()");} public void pac () {print ("concrete2.pac ()");} public void pro () {print ("concrete2.pro () (); }Karena metode di Concretel memiliki hak akses publik, mereka dapat diakses di Concrete2, dan setiap metode dalam Concrete2 mencakup metode yang sesuai secara terpisah. Selain itu, karena Concrete2 dan AbstractBase berada dalam paket yang sama, metode AbstractBase.pac juga dapat diakses di Concrete2, dan metode Concrete2.pac dapat ditimpa. Panggil metode show pada objek Concrete2, dan hasil cetak adalah sebagai berikut:
Abstractbase.pri () concrete2.pac () concrete2.pro () concrete2.pub ()
Akhirnya, kami mendefinisikan Class Concrete3 untuk memperpanjang kelas Conon2 dan memasukkannya ke dalam paket P3:
Paket P3 Impor P1.concrete2; Public Class Concrete3 memperluas CONCRETE2 {public void pri () {print ("concrete3.pri ()");} public void pac q {print ("concrete3.pac ()");} public void pro () {print ("concrete) () (); Objek CONCRETE3, dan hasil pencetakan adalah sebagai berikut: abstrakbase.pri () concrete3.pac () concrete3.pro () concrete3.pub ()Di sini metode CONCRETE3.PAC sepertinya mengesampingkan metode abstractbase.pac yang tidak dapat diakses, tetapi pada kenyataannya, metode Concrete3.pac menimpa metode CONCRETE2.PAC, dan metode CONCRETE2.PAC mengesampingkan metode abstractbase.pac, jadi metode CONCRETE3.PAC secara tidak langsung mengesampingkan metode abstrak.pac. Dengan mereduksi ulang metode PAC di kelas Concrete2 sebagai memiliki izin akses publik, dapat diakses dan ditimpa oleh subkelas mana pun. '