Java’daki paket mantığını tamamen aynı olmasa da işletim sistemimizde kullandığımız dizin yapısına benzetebiliriz. Arkadaşımızdan aldığımız harici diskten müzik ve fotoğraf kopyalayacağımızı düşünelim. Diskteki dosyalar karışık olsalar bile kendi bilgisayarımıza kopyalarken müzik dosyalarını ayrı bir klasöre, resim dosyalarını ayrı bir klasöre kopyalar, saklarız. Hatta aradığımız dosyalara daha hızlı erişebilmek için türkçe müzikler için ayrı bir klasör, yabancı müzikler için ayrı bir klasör açarız.
Kod yazarken de bütünlüğü korumak adına sınıflarımızı farklı paketlerde saklarız. Mantıksal olarak benzer işler yapan sınıflar aynı pakette bulunurlar.
Bir sınıfın ait olduğu paketi belirtmek için “package” saklı kelimesinden sonra sınıfın içinde bulunduğu paketin ismi yazılır. Paket tanımı mutlaka ilk komut olarak yazılmalıdır.
Aslında bütün sınıflar bir pakete ait olmak zorundadır. Hiç bir isim verilmediğinde o sınıf isimsiz “default package“da kabul edilir. Paketi belirtilmemiş bütün sınıflar aynı paketin sınıfları sayılır. Fakat sadece örnek olsun diye yazılan bu gibi sınıflara başka paketlerden erişilemez. Hatta derlenemez durumda bırakılan test sınıfları bile yine paketsiz olan başka bir sınıfın derlenmesini engelleyebilir.
package spor; public class Bilardo { // sınıf kodları }
Bir sınıfın kendisiyle aynı pakette olmayan sınıfı kullanabilmesi için, o sınıfı kullandığını derleyiciye söylemesi gerekir. Bunun için paket tanımı ile sınıf tanımı arasına import saklı kelimesini kullanarak o sınıfı ekler. Bu sadece kullanılan sınıfların tam olarak hangi pakette olduğunu söylemek anlamına gelir. Gerekli olan metot ya da değişken kullanıldığında çalışacak olan kodun nerede olduğu bilgisini JVM’e (Java Virtual Machine) söylemiş oluruz.
package bnmPaketim; import spor.Bilardo; public class MasaTenisi { // sınıf kodları }
“bnmPaketim” paketindeki MasaTenisi sınıfının spor paketindeki Bilardo sınıfını kullanacağı anlamına gelir. Aynı paketteki sınıfların birbirlerini ‘import’ etmeleri gerekmez.
İç içe paketler tanımlanabilir. Bu gibi durumlarda alt paketler altındaki sınıflara paketler arasına nokta konularak ulaşılır. Örneğin spor paketi altına bir de bireysel adında bir paket daha tanımlayalım. İçerisinde de Bilardo sınıfımız olsun. Başka bir paketten Bilardo sınıfına erişebilmek için;
import spor.bireysel.Bilardo;
yazılmalıdır.
‘java.lang‘ paketi özel bir pakettir. Bu paketteki sınıfları kullanmak için import ifadesine gerek yoktur. Bu paket olmadan hiç bir Java programı yazılamayacağı için import edilmiş varsayılır. Örneğin “String” sınıfı “java.lang” paketinde olduğu için her bir String kullandığımızda başına java.lang.String yazmamıza ya da java.lang paketini sınıfa import etmemize gerek kalmaz.
Bir paketteki bütün sınıfları import etmek için ‘*‘ operatörü kullanılabilir.
package bnmPaketim; import spor.*; public class Araba { // sınıf kodları }
Örnek kodumuzda Araba sınıfı spor paketindeki tüm sınıfları kullanabilir. Çok dikkat edilmesi gereken bir konu ise Araba sınıfının spor paketindeki ‘bireysel’ paketi altındaki Bilardo sınıfını kullanamayacağıdır. Bir paket import edildiğinde sadece o paket altındaki sınıflara erişilebilir. Aynı paket altında başka paketler varsa, o paketlerdeki sınıflar import edilmiş olmaz. İç içe paketler tanımlamanın amacı bir paket altındaki sınıf sayısını mantıksal bütünlüğü koruyarak azaltmaktır.
* kullanmak alt alta çok sayıda import ifadesi yazmaktan daha kolay gibi gelebilir. Bazı programcılar okunurluğu arttırmak için böyle bir yola gitmektedirler. Ama bence okunurluğu arttırmaktan ziyade paket içerisindeki hangi sınıfın çalıştığını görmek daha işlevsel olacaktır. * kullandığımızda kullanılmayan sınıfların da gereksiz yere kendi sınıfımıza eklendiği gibi bir durum söz konusu değildir. Yani performans kaybına yol açmaz fakat yine de kodumuzu yazarken sadece kullandığımız sınıfları import etmeliyiz.
package bnmPaketim; import tasit.*; public class Test { // sınıf kodu içerisinde // hem Gemi // hem Otobus // hem Tren // hem Ucak sınıfları kullanılacak }
yerine
package bnmPaketim; import tasit.Gemi; import tasit.Otobus; import tasit.Tren; import tasit.Ucak; public class Test { // sınıf kodu içerisinde // hem Gemi // hem Otobus // hem Tren // hem Ucak sınıfları kullanılacak }
Aslında her sınıf paket ismiyle birlikte adlandırılır. Örneğin, ‘tasit’ isimli bir pakette ‘Araba’ isimli bir sınıfın tam nitelendirilmiş ismi ‘tasit.Araba’ dır. import ifadesi, sadece yazılımcıyı her sınıf ismini böyle uzun yazmaktan kurtarmaktadır. Söylemek istediğim şey hiçbir import ifadesi kullanmadan da gerekli sınıfları tam ismiyle çağırabiliriz.
package bnmPaketim; public class Test { public static void main(String[] args) { tasit.Gemi gemi = new tasit.Gemi(); // diğer kodlar } }
Yukarıdaki gibi “tasit” paketinde olan Gemi sınıfının instance’ını “import tasit.Gemi;” ya da “import tasit.*;” diyerek kullanmak istersek;
Gemi gemi = new Gemi();
şeklinde yaratabiliriz. Hiç import kullanmazsak instance yaratmak için ;
tasit.Gemi gemi = new tasit.Gemi();
yazabiliriz.
Java’nın kendi uygulama programlama arayüzü bir çok sınıftan oluştuğu için bir çok paket altında gruplandırılmıştır. Bunların çoğu ‘java.’ ve ‘javax.’ la başlar. ‘javax’ ile başlayanlar sonradan ekleme paketler için kullanılır. Önceden eklenti olan paketler daha sonra standart API’ye dahil edilmişlerdir.
İsimlendirme Geleneği :
Paket isimlerinin rastgele verilmesi bazı sorunlara yol açabilir. Örneğin bir sistemde farklı kurumlara ait paketler olsun. Aynı paket ismini başka bir kurum da kullandıysa sunucuya yüklenen kodlardan hangisi önce bulunur ve hafızaya yüklenirse o kod çalışır.
Bu sorunlarla karşılaşmamak için paket isimlerinde standart bir yöntem uygulanır. Bu isimlendirme standartı SUN şirketinin belirlediği bir standarttır. Uygulama içerisindeki paketler isimlendirilirken kurumun sahip olduğu internet domain ismi tersten yazılır.
Örneğin ‘www.infopark.com’a sahip olan kurum veya kişiler, mesajlasma ile ilgili sınıflarını ‘com.infopark.mesajlasma’ diye bir pakete koyabilirler. SUN firması da kendi paketlerini ‘com.sun’ şeklinde başlatmaktadır. Genelde özel kuruluşlar com, ticari olmayan kurumlar da org ile başlarlar.