Sebagian besar jawaban di sini menyatakan bahwa tidak ada subpackage di Jawa, tetapi itu tidak sepenuhnya akurat. Istilah ini telah dalam Spesifikasi Bahasa Jawa sejauh Jawa 6, dan mungkin lebih jauh ke belakang (sepertinya tidak ada versi JLS yang dapat diakses secara bebas untuk versi Java yang lebih lama). Bahasa di sekitar subpackages tidak banyak berubah di JLS sejak Java 6.
Anggota sebuah paket adalah subpackage-nya dan semua tipe kelas tingkat atas dan tipe antarmuka tingkat atas yang dinyatakan dalam semua unit kompilasi paket.
Misalnya, di Java SE Platform API:
- Paket ini
java
memiliki subpackages awt
, applet
, io
, lang
, net
, dan util
unit, tetapi tidak ada kompilasi.
- Paket ini
java.awt
memiliki sub paket bernama image
, serta sejumlah unit kompilasi yang berisi deklarasi tipe kelas dan antarmuka.
Konsep subpackage relevan, seperti memberlakukan batasan penamaan antara paket dan kelas / interface:
Paket mungkin tidak mengandung dua anggota dengan nama yang sama, atau hasil kesalahan waktu kompilasi.
Berikut ini beberapa contohnya:
- Karena paket tersebut
java.awt
memiliki subpackage image
, paket tidak dapat (dan tidak) berisi deklarasi kelas atau tipe antarmuka yang dinamai image
.
- Jika ada paket bernama
mouse
dan tipe anggota Button
dalam paket itu (yang kemudian dapat disebut sebagai mouse.Button
), maka tidak ada paket dengan nama mouse.Button
atau kualifikasi penuh mouse.Button.Click
.
- Jika
com.nighthacks.java.jag
nama jenis yang sepenuhnya memenuhi syarat, maka tidak mungkin ada paket yang nama lengkapnya memenuhi syarat adalah com.nighthacks.java.jag
atau com.nighthacks.java.jag.scrabble
.
Namun, batasan penamaan ini adalah satu - satunya signifikansi yang diberikan kepada sub paket oleh bahasa:
Struktur penamaan hirarkis untuk paket dimaksudkan agar nyaman untuk mengatur paket terkait secara konvensional, tetapi tidak memiliki arti penting selain larangan terhadap paket yang memiliki subpackage dengan nama sederhana yang sama dengan tipe tingkat atas yang dinyatakan dalam paket tersebut. .
Misalnya, tidak ada hubungan akses khusus antara paket yang diberi nama oliver
dan paket lain yang diberi nama oliver.twist
, atau antara paket yang diberi nama evelyn.wood
dan evelyn.waugh
. Artinya, kode dalam paket bernama oliver.twist
tidak memiliki akses yang lebih baik ke jenis yang dinyatakan dalam paket oliver
daripada kode dalam paket lain.
Dengan konteks ini, kita dapat menjawab pertanyaan itu sendiri. Karena secara eksplisit tidak ada hubungan akses khusus antara paket dan subpackage-nya, atau antara dua subpackages yang berbeda dari paket induk, tidak ada cara dalam bahasa untuk membuat metode terlihat oleh dua paket berbeda dengan cara yang diminta. Ini adalah keputusan desain yang terdokumentasi dan disengaja.
Entah metode tersebut dapat dibuat publik dan semua paket (termasuk odp.proj
dan odp.proj.test
) akan dapat mengakses metode yang diberikan, atau metode tersebut dapat dibuat paket pribadi (visibilitas default), dan semua kode yang perlu mengaksesnya secara langsung harus dimasukkan ke dalam paket (sub) yang sama dengan metode.
Yang mengatakan, praktik yang sangat standar di Jawa adalah memasukkan kode tes dalam paket yang sama dengan kode sumber, tetapi di lokasi yang berbeda pada sistem file. Misalnya, dalam alat pembuatan Maven , konvensi adalah untuk menempatkan file sumber dan uji masing-masing dalam src/main/java/odp/proj
dan
src/test/java/odp/proj
. Ketika alat build mengkompilasi ini, kedua set file berakhir di odp.proj
paket, tetapi hanya src
file yang termasuk dalam artefak produksi; file uji hanya digunakan pada waktu build untuk memverifikasi file produksi. Dengan pengaturan ini, kode pengujian dapat dengan bebas mengakses setiap paket kode pribadi atau dilindungi dari kode yang diuji, karena mereka akan berada dalam paket yang sama.
Dalam kasus di mana Anda ingin berbagi kode lintas sub paket atau paket saudara bukan kasus uji / produksi, salah satu solusi yang saya lihat beberapa perpustakaan gunakan adalah dengan meletakkan kode bersama sebagai publik, tetapi mendokumentasikan bahwa itu dimaksudkan untuk perpustakaan internal gunakan saja.