Buradaki cevapların çoğu, Java'da bir alt paket diye bir şey olmadığını belirtti, ancak bu kesinlikle doğru değil. Bu terim Java Dil Spesifikasyonunda Java 6'ya kadar ve muhtemelen daha da geriye gitmiştir (Java'nın önceki sürümleri için JLS'nin serbestçe erişilebilir bir sürümü yoktur). Alt paketlerin etrafındaki dil, Java 6'dan bu yana JLS'de çok fazla değişmedi.
Bir paketin üyeleri, alt paketleri ve paketin tüm derleme birimlerinde bildirilen tüm üst düzey sınıf türleri ve üst düzey arabirim türleridir.
Örneğin, Java SE Platform API'sında:
- Paket
java
alt paketlerin vardır awt
, applet
, io
, lang
, net
, ve util
, ancak hiçbir derleme birimleri.
- Paket
java.awt
adında bir alt paketin image
yanı sıra sınıf ve arabirim türlerinin bildirimlerini içeren bir dizi derleme birimine sahiptir.
Paketler ve sınıflar / arayüzler arasındaki adlandırma kısıtlamalarını zorladığı gibi, alt paket kavramı da geçerlidir:
Bir pakette aynı ada sahip iki üye olmayabilir veya derleme zamanı hatası oluşur.
İşte bazı örnekler:
- Paket
java.awt
bir alt pakete sahip olduğundan, adlı image
bir sınıf veya arabirim türü bildirimi içeremez (ve içermez) image
.
- Bu pakette adlandırılmış bir paket
mouse
ve üye türü varsa Button
(o zaman bu ad olarak adlandırılabilir mouse.Button
), tam olarak nitelenmiş mouse.Button
veya mouse.Button.Click
.
- Eğer
com.nighthacks.java.jag
bir tür tam adıdır, o zaman kimin tam ad olduğunu herhangi bir paket olamaz com.nighthacks.java.jag
ya com.nighthacks.java.jag.scrabble
.
Ancak bu adlandırma sınırlamadır tek dile göre alt paket sağlanan önem:
Paketler için hiyerarşik adlandırma yapısı, ilgili paketleri geleneksel bir şekilde organize etmek için uygun olmakla birlikte, bu pakette beyan edilen üst düzey tiple aynı basit ada sahip bir alt pakete sahip bir pakete karşı yasağın dışında hiçbir önemi yoktur. .
Örneğin, adlandırılmış bir paket ile adlandırılmış oliver
başka bir paket oliver.twist
arasında veya evelyn.wood
ve adlı paketler arasında özel bir erişim ilişkisi yoktur evelyn.waugh
. Diğer bir deyişle, adlı oliver.twist
paketteki oliver
kodun, paket içinde bildirilen türlere, diğer paketlerdeki koddan daha iyi erişimi yoktur .
Bu bağlamda, sorunun kendisine cevap verebiliriz. Bir paket ve onun alt paketi arasında veya bir üst paketin iki farklı alt paketi arasında açıkça özel bir erişim ilişkisi olmadığından, bir yöntemi istenen şekilde iki farklı pakete görünür hale getirmenin bir yolu yoktur. Bu belgelenmiş, kasıtlı bir tasarım kararıdır.
Yöntem herkese açık hale getirilebilir ve tüm paketler ( odp.proj
ve dahil odp.proj.test
) verilen yöntemlere erişebilir veya yöntem paketi özel hale getirebilir (varsayılan görünürlük) ve doğrudan erişmesi gereken tüm kodlar yöntemle aynı (alt) paket.
Bununla birlikte, Java'daki çok standart bir uygulama, test kodunu kaynak koduyla aynı pakete, ancak dosya sisteminde farklı bir yere koymaktır. Örneğin, içinde Maven inşa aracı, kongre bu kaynak ve test dosyaları koymak olacaktır src/main/java/odp/proj
ve
src/test/java/odp/proj
sırasıyla. Derleme aracı bunu derlediğinde, her iki dosya kümesi de odp.proj
pakette sonlanır , ancak src
üretim dosyasında yalnızca dosyalar bulunur; test dosyaları sadece üretim sırasında üretim dosyalarını doğrulamak için kullanılır. Bu kurulumla, test kodu, aynı pakette olacağı için test ettiği kodun özel veya korumalı koduna ait herhangi bir pakete serbestçe erişebilir.
Test / üretim durumu olmayan alt paketler veya kardeş paketleri arasında kod paylaşımı yapmak istediğinizde, bazı kütüphanelerin kullandığını gördüğüm bir çözüm, bu paylaşılan kodu genel olarak koymak, ancak dahili kütüphane için tasarlandığını belgelemek sadece kullan.