Paketler
Java'da paketler, birbirleriyle ilişkili sınıf, arayüz ve alt paketleri gruplandırmak için kullanılan bir mekanizmadır. Paketler, sınıfları ve diğer paketleri bir arada tutarak, aynı isimdeki sınıfların çakışmasını önler ve kodun düzenli olmasını sağlar.
Paketler, Java'da dosya sistemi düzenine benzer şekilde hiyerarşik bir yapıda oluşturulur. Bir paket, diğer paketler içerebilir ve paketler, nokta ile ayrılan bir adla belirtilir. Örneğin, java.util paketi, java paketinin altındaki bir util alt paketidir.
Paketler, dosya sistemi düzeninde olduğu gibi, paket adını taşıyan bir dizin içinde sınıf dosyalarını saklar. Örneğin, java.util paketinin sınıfları, java/util dizinindeki .class dosyaları olarak saklanır.
Paketler, aşağıdaki avantajları sağlar:
- Sınıfları düzenlemek ve yönetmek için daha iyi bir yapı sağlar.
- Sınıfların yeniden kullanılabilirliğini artırır.
- Sınıfları ve diğer paketleri gizleyerek, çakışan isimleri önler.
- Kodu daha okunaklı hale getirir.
Paketleri kullanarak, bir sınıfın tam adını yazmak gerekir. Örneğin, java.util paketindeki Date sınıfı için tam ad, java.util.Date'dir.
Bir sınıfın bir paketteki başka bir sınıfı kullanabilmesi için, import anahtar kelimesi kullanılarak kullanılmak istenen sınıfın tam adı belirtilmelidir. Örneğin, aşağıdaki örnek, java.util paketindeki Date sınıfını kullanır:
import java.util.Date;
public class MyClass {
public static void main(String[] args) {
Date tarih = new Date();
System.out.println(tarih);
}
}
Yukarıdaki örnekte, java.util paketindeki Date sınıfı, import anahtar kelimesi kullanılarak MyClass sınıfına dahil edilir ve ardından tarih adlı bir değişkene atanır ve ekrana yazdırılır.
Varsayılan Paket
Java'da varsayılan paket, hiçbir paket adı belirtilmeden yazılan sınıfların yer aldığı pakettir. Java sınıfları, bir paket içinde tanımlanırlar ve herhangi bir paket adı belirtilmeden tanımlanan sınıflar varsayılan paket içinde yer alırlar. Ancak, varsayılan paketin kullanımı önerilmemektedir.
Sınıfların kaynak kodları, .java dosyaları olarak yazılırlar ve derlenerek .class dosyalarına dönüştürülürler. .java dosyaları, sınıfların kaynak kodlarının yer aldığı dosyalardır ve açık kaynak kodlu projelerde bu dosyalar paylaşılır.
.class dosyaları, Java kodunun derlenerek JVM tarafından çalıştırılabilen makine koduna dönüştürülmüş halidir. .class dosyaları, sınıfların kaynak kodlarının derlenmiş halini içerir ve sınıfların çalışma zamanında JVM tarafından yüklenmesi için kullanılır.
Java sınıflarının .class dosyaları, sınıfın adına ve paket adına göre belirlenir. Örneğin, java.util paketi altındaki Date sınıfı için .class dosyası adı, Date.class olacaktır. Sınıflar, JVM tarafından çalıştırılmadan önce .class dosyalarına yüklenir ve sınıf yükleyicisi tarafından yüklenir.
Java'da varsayılan paketin kullanımı önerilmemektedir çünkü bu, sınıfların paketleme ve modülerleştirme konularında sorunlar yaşamasına neden olabilir. Paketleme, sınıfların gruplandırılmasını ve yönetilmesini sağlar ve bu nedenle, sınıfların belirli bir paket içinde yer almaları önerilir.
Paket Oluşturma
Java'da paket isimleri, genellikle ters domain adı (reverse domain name) şeklinde tanımlanır. Bu, bir organizasyonun ya da geliştiricinin internet domain adının ters çevrilerek kullanılmasıdır. Örneğin, "example.com" alan adı için bir paket ismi "com.example" olarak tanımlanabilir.
Paket isimleri, küçük harflerle yazılır ve kelime aralarında nokta kullanılır. Paket isimleri, sınıf adları gibi anlamlı ve açıklayıcı olmalıdır ve ilgili sınıfların kullanım amacını yansıtmalıdır.
Örneğin, bir projede veritabanı işlemleri için bir paket oluşturulabilir ve bu paketin ismi "com.example.projectname.database" olarak tanımlanabilir. Bu şekilde, projenin diğer bileşenleri ile ayrım yapmak daha kolay olur ve kodun okunabilirliği artar.
Paket isimlendirmesi, Java'nın üst düzey paketleri olan java, javax, com.sun, com.oracle vb. gibi önceden tanımlanmış isimleri kullanmamalıdır. Bu önceden tanımlanmış paket isimleri, Java dilinin kendisi veya Java sanal makinesi tarafından kullanılan paketlerdir ve geliştiricilerin kendi kodlarında kullanmamaları önerilir.
Çakışma
Java'da paket isimleri, birbirleriyle çakışabilir ve bu durumda isim çakışmaları çözülmelidir. Paket isim çakışmaları, iki paketin aynı isimle tanımlanması veya bir paketin isminin başka bir paketin alt paketi ile aynı olması durumlarında ortaya çıkabilir.
Bu tür isim çakışmalarının çözümü, iki farklı paketin isimlerini değiştirmek veya bir paketin ismini değiştirerek çakışmayı önlemektir. Paket isimleri, küçük harflerle yazılır ve nokta (.) ile ayrılan bir dizi kelime kullanılır. İki paket ismi arasındaki fark, en az bir kelimenin farklı olmasıdır.
Örneğin, iki farklı projede "com.example" adında bir paket kullanılmak istenirse, isim çakışması oluşur. Bu durumda, bir projede paket ismi "com.example.project1" olarak değiştirilebilirken, diğer projede "com.example.project2" olarak değiştirilebilir.
Java, paket isimlerini birbirinden ayırmak için benzersiz bir kimliklendirici olan paket imzası (package signature) kullanır. Paket imzası, bir paketin içinde yer alan sınıf isimlerinin ve ilgili paketlerin isimlerinin bir karmasıdır ve paketin benzersiz bir tanımlayıcısıdır. Bu sayede, farklı paketlerin isimlerinin aynı olması durumunda bile paket imzaları farklı olacaktır.
Erişim Belirleyiciler
Java'da erişim belirleyicileri, sınıf, değişken, metod ve diğer bileşenlerin erişim seviyesini belirler. Bu belirleyiciler, farklı erişim seviyelerine sahip bileşenlerin diğer sınıflar tarafından nasıl kullanılabileceğini kontrol eder. Java'da dört farklı erişim belirleyicisi vardır:
- public: "public" belirleyici, sınıf, değişken veya metoda herhangi bir yerden erişilebileceğini belirtir. Bu erişim belirleyicisi, tüm paketler ve farklı paketlerdeki diğer sınıflar tarafından kullanılabilir.
- private: "private" belirleyici, sınıf, değişken veya metoda sadece aynı sınıf içinden erişilebileceğini belirtir. Bu erişim belirleyicisi, diğer sınıflar tarafından kullanılamaz ve sınıfın içindeki verilerin gizliliğini korumak için kullanılır.
- protected: "protected" belirleyici, sınıf, değişken veya metoda aynı paketten veya alt sınıflardan erişilebileceğini belirtir. Bu erişim belirleyicisi, sınıfın alt sınıflarından erişim sağlamak için kullanılır.
- default : "default" belirleyici, bir bileşenin yalnızca aynı paketten erişilebileceğini belirtir. Bu erişim belirleyicisi, başka paketlerdeki sınıfların erişimini sınırlamak için kullanılır. Bu belirleyici kullanılırken, erişim belirleyicisi belirtilmez ve yalnızca bileşenin adı yazılır.
class MyClass { // varsayılan erişim belirleyicisi kullanıldı
public int x; // herhangi bir yerden erişilebilir
private int y; // sadece aynı sınıf içinden erişilebilir
protected int z; // aynı paket ve alt sınıflardan erişilebilir
void myMethod() { // varsayılan erişim belirleyicisi kullanıldı
// metot içeriği
}
}
Bu örnekte, "MyClass" sınıfı varsayılan erişim belirleyicisiyle tanımlanmıştır. "x" değişkeni "public" erişim belirleyicisiyle herhangi bir yerden erişilebilirken, "y" değişkeni "private" erişim belirleyicisiyle sadece aynı sınıf içinden erişilebilir. "z" değişkeni "protected" erişim belirleyicisiyle aynı paket ve alt sınıflardan erişilebilir. "myMethod" metodu ise varsayılan erişim belirleyic
Kapsülleme
Java'da kapsülleme, nesne yönelimli programlama prensiplerinden biridir ve sınıfların ve nesnelerin verilerine ve davranışlarına sadece belirli bir şekilde erişilebilmesini sağlar. Bu, verilerin gizliliğini korumak, sınıflar arasındaki bağımlılıkları azaltmak ve kodun yeniden kullanılabilirliğini artırmak gibi birçok fayda sağlar.
Kapsülleme, Java'da birçok farklı mekanizma tarafından sağlanır. Bunlar arasında:
- Erişim Belirleyicileri: Erişim belirleyicileri, sınıfların ve nesnelerin verilerine ve davranışlarına erişim seviyesini kontrol etmek için kullanılır. Java'da, "public", "private" ve "protected" gibi erişim belirleyicileri vardır. "public" erişim belirleyici, herhangi bir yerden erişime izin verirken, "private" erişim belirleyici sadece aynı sınıf içindeki bileşenlere erişime izin verir.
- Getter ve Setter Metotları: Getter ve setter metotları, sınıfın verilerine erişim sağlamak için kullanılır. Getter metotları, sınıfın verilerine erişim sağlamak için kullanılırken, setter metotları, sınıfın verilerini güncellemek için kullanılır. Bu yöntemler, sınıfın verilerini doğrudan değiştirme yerine, verilere özel bir şekilde erişim sağlar.
Örneğin, aşağıdaki sınıfın "name" özelliği "private" olarak tanımlanmıştır ve sadece "getName" ve "setName" metotları aracılığıyla erişilebilir:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String newName) {
name = newName;
}
}
- final Anahtar Sözcüğü: "final" anahtar sözcüğü, bir değişkenin değerinin değiştirilemeyeceğini belirtir. Bu, bir değişkenin bir kez ayarlandıktan sonra değiştirilemez olmasını ve verilerin yanlışlıkla değiştirilmesini önlemek için kullanılır.
Örneğin, aşağıdaki sınıfın "id" özelliği "final" olarak tanımlanmıştır ve sadece bir kez ayarlanabilir:
public class Employee {
private final int id;
public Employee(int newId) {
id = newId;
}
public int getId() {
return id;
}
}
Kapsülleme, Java'da nesne yönelimli programlama prensiplerinden biridir ve sınıfların ve nesnelerin verilerine ve davranışlarına sadece belirli bir şekilde erişilebilmesini sağlar.