Çarşamba, Nisan 16, 2008

Java paketleri

Ornijanli burada olan belgeyi çevirmeyi hep düşünüyordum. Java paket mevzusu çok sade ve anlaşılır bir şekilde anlatılmış.

JAVA Paketleri
İçerik

* Giriş
* Örnekler
* Java Derleyicisi dosyaları nasıl buluyor
* CLASSPATH çevre değişkeni

Giriş

* Her sınıf bir paketin parçasıdır.

* Bir dosya içindeki bütün sınıflar aynı paketin parçasıdır.

* Paket belirtimi şöyle yapılır:
package paket-adı;
dosyanın ilk (non-comment) satırında.

* Farklı dosyalar aynı paketi belirtebilir.

* Eğer herhangi bir paket belirtilmediyse bir dosyadaki sınıflar özel, isimsiz bir pakete (tüm dosyalar için aynı isimsiz paket) dahil edilirler.

* Eğer package paket-adı belirtildiyse dosya paket-adı dizininde olmalıdır (dizin adıyla paket adı uyuşmalıdır).

* Başka bir (ismi belli olan) paketteki public sınıfa şöyle erişebilirsiniz:
paket-adı.sınıf-adı
Böyle sınıfların public eleman saha veya fonksiyonlarına şöyle erişebilirsiniz:
paket-adı.sınıf-adı.elema-saha-veya-fonksiyon-adı
paket-adını kullanma zorunluluğundan şöyle kurtulabilirsiniz:
import paket-adı.*; veya
import paket-adı.sınıf-adı;
(dosyanın ilk satırlarında package deklerasyonundan sonra). İlki paketteki tüm sınıfları içe aktarır (import), ikincisi sadece belirtilen sınıfı. Bu şekilde sadece paket-adı nı yazmaktan kurtuluruz. Hala sınıfa erişmek için sınıf-adı nı, eleman saha veya fonksiyonlara erişmek için sınıf-adı.eleman-saha-veya-fonksiyon-adı nı kullanmalıyız.

Örnekler

Javadir isimli dizinde çalıştığınızı ve aşağıdaki gibi kodları olan dosyalar oluşturduğunuzu farzedin.

dosya 1
package ListPkg;
public class List { ... }
class ListNode {...}

dosya 2
package ListPkg;
public class NoNextItemException { ... }


dosya 3
public class Test { ... }
class Utils { ... }

dosya 4
class Test2 { ... }

Kullanmanız gereken dizin ve dosya isimleri şöyle olmalı:

* Dosya 1 List.java isimli dosyada, Listpkg dizininde bulunmalı.
* Dosya 2 NoNextItemException.java isimli dosyada ve yine Listpkg dizininde bulunmalı.
* Dosya 3 Test.java isimli dosyada bulunmalı (Javadir dizininde).
* Dosya 4 .java uzantılı her hangi isimli dosyada bulunabilir (Javadir dizininde).

Bunlar da her bir dosyanın kodundan erişilebilecek sınıflar:

* Dosya 1 ve 2:
o İlk iki dosyadaki kodlar (ListPkg/List.java ve ListPkg/NoNextItemException.java) aynı paketin içindeki sınıflara erişebilirler (List, ListNode, ve NoNextItemException). (Bu paketler için erişim belirtilmediğinden varsayılan paket erişimini kullanırlar)

o Dosya 1 ve 2 deki kodlar, her ne kadar public olarak tanımlansa da, Test sınıfına erişemezler. Problem şudur ki Test sınıfı isimsiz bir paketin içindedir, bu yüzden bu paketi veya Test sınıfını içe aktarmanın yolu yoktur.

o Dosya 1 ve 2 deki kodlar Utils ve Test2 sınıflarına erişemezler çünkü bu sınıflar farklı pakettedir ve varsayılan paket erişimine sahiptirler.

* Dosya 3 ve 4:
o Dosya 3deki kodlar (Test.java) ListPkg.List, ListPkg.NoNextItemException, Test, Utils, and Test2 sınıflarına erişebilir. (ilk ikisi isimli bir pakettei public sınıflar olduklarından, son üçü aynı isimsiz pakette ve hem public hem de paket erişiminden dolayı). Yine de dikkat edin, eğer Test.java daki kodlar Test2 sınıfını kullanırsa ve bu sınıf Test2.java isimli dosyada değilse Test2 sınıfının olduğu dosya önce derlenmelidir, aksi taktirde bu sınıf bulunamaz.

o Dosya 4 deki kodlar (Test2 sınıfını içeren dosya) Dosya 3 (Test.java) dekilerle aynı sınıflara erişebilirler.

Örneği özetlemek gerekirse:
Here's a summary of the example:
File Contents Directory/FileName Can Access

package ListPkg;
public class List {...}
class ListNode {...}

ListPkg/List.java List, ListNode, NoNextItemException

package ListPkg;
public class NoNextItemException
{...}

ListPkg/NoNextItemException.java List, ListNode, NoNextItemException

public class Test {...}
class Utils {...}

Test.java ListPkg.List, ListPkg.NoNextItemException, Test, Utils, Test2

class Test2 {...}

any-name.java ListPkg.List, ListPkg.NoNextItemException, Test, Utils, Test2

Java Derleyicisi dosyaları Nasıl bulur

Aynı dosyada tanımlı olmayan bir sınıfı (veya arayüzü [interface]) kullanan bir dosyayı derlediğinizde Java derleyicisi sınıf tanımlamasının olduğu yeri bulmak için şunları kullanır


* sınıfın adı
* içe aktarılan paket isimleri (eğer varsa)
* dahil olduğu paket ismi

Örneğin, içinde Test.java isimli tek bir dosyanın olduğu Javadir dizininde çalıştığınızı farzedin:

import ListPkg.*;

public class Test {
List L;
...
}

List Tedt.java'da tanımlı olmadığından ve dizinde List.java bulunmadığından derleyici ListPkg altdizininde List.javayı arayacak (Test.java Listpkg yi içe aktardığı için).

Şimdi ListPkg altdizininin içinde iki dosya olduğunu varsayalım: List.java ve ListNode.java, her ikisi de ListPkgye dahil. Ayrıca List.java nın ListNode.java da tanımlı olan List sınıfını kullandığını varsayalım. List.java yı ListPkg altdizininde derlemeye çalışırsanız hata alırsınız, çünkü derleyici List.java yı aktif dizinde aramak yerine ListPkg altdizininde bulmayı deneyecektir.

Bu problemi çözmenin (en azından) üç yolu vardır:

1. Bir paketi her zaman üst dizinden derleyin. Örneğin List.java yı Javadir/Listpkg dizini yerine Javadir dizini içindeyken derleyin. Javadir dizininde şu komutu girin:
javac ListPkg/List.java
2. Bir paketteki tüm dosyaları her zaman aynı anda derleyin; örneğin Javadir/LitsPkg dizininde şu komutu girin:
javac *.java
3. Paketin bulunduğu altdizinden kendisine dairesel sembolik link tanımlayın; Javadir/ListPkg dizininde:
ln -s . ListPkg

CLASSPATH Çevre Değişkeni

Aktif dizinin (örn. javac komutunu verdiğiniz dizin) alt dizininde olmayan bir paketi kullanmak için, Java derleyicisinin nereye bakması gerektiğini belirtmek amacıyla CLASSPATH çevre değişkenini girmelisiniz.

Örneğin /p/course/cs368-horwitz/public/ListPkg dizini içinde bir List paketi bulunuyorsa CLASSPATH değişkenini şöyle ayarlamalısınız:
setenv CLASSPATH .:/p/course/cs368-horwitz/public

Nokta ve iki nokta üstüste (.:) derleyiciye ayrıca derlmenin yapıldığı dizine de bakmasını şöyler. Dikkat edin, CLASSPATH çevre değişkeni ListPkg nin üst dizinine ayarlandıi ListPkg dizininin kendisine değil.

1 yorum:

Necdet Yücel dedi ki...

İnsan değilsiniz Kemal bey ;) hürmetler,bravo