Java’da Genişletme ve Autoboxing Arasındaki Farkı Anlamak
Java programlamaya dalış yaparken, özellikle yöntem aşırı yüklemesi ile ilgili olarak, geliştiriciler sıklıkla genişletme
ve autoboxing
gibi terimlerle karşılaşır. Bu kavramlar arasındaki farkı anlamak, verimli Java kodu yazmak için çok önemlidir. Bu makale her iki terimi açıklayacak, aralarındaki ayrımları örneklerle gösterecek ve Java derleyicisi tarafından üretilen bayt kodunu analiz edecektir.
Genişletme Nedir?
Genişletme, daha küçük bir ilkel türü, daha büyük bir ilkel türüne dönüştürme işlemidir. Java’da bu, daha küçük bir türdeki bir değer, daha büyük bir tür gerektiren bir yönteme geçirildiğinde otomatik olarak meydana gelir. İşte bir örnek:
public class MethodOverloading {
public static void hello(long x) {
System.out.println("long");
}
public static void main(String[] args) {
int i = 5;
hello(i); // Burada 'i' long'a genişletiliyor
}
}
Genişletmenin Çalışma Şekli
Yukarıdaki örnekte, int
türündeki (yaklaşık 2 milyar değere kadar tutabilen) bir ilkel değer hello(long x)
metoduna iletilmektedir; bu, bir long
parametre alır. Java derleyicisi yöntemi çağırdığında int
türünü otomatik olarak long
türüne genişletir.
Sonuç olarak oluşan bayt kodunu javap
aracı ile analiz ederseniz, şöyle görünecektir:
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: istore_1
2: iload_1
3: i2l // Genişletme dönüşümü
4: invokestatic #6; //Method hello:(J)V
7: return
i2l
komutu, tam sayının metoda iletilmeden önce uzun türüne genişletildiğini gösterir.
Autoboxing Nedir?
Autoboxing ise, bir ilkel türün karşılık geldiği sarmalayıcı sınıfa otomatik dönüşümünü ifade eder (örneğin, int
‘in Integer
‘a, char
‘ın Character
‘a). Bu özellik Java 5’te tanıtıldı ve koleksiyonları iyileştirerek sıkıcı kutulama ve kutudan çıkarma kodunu azaltmaya yardımcı oldu.
Autoboxing Örneği
Sarmalayıcı sınıf kullanan değiştirilmiş bir örneği düşünün:
public class MethodOverloading {
public static void hello(Integer x) {
System.out.println("Integer");
}
public static void main(String[] args) {
int i = 5;
hello(i); // Burada 'i' Integer'a otomatik olarak kutulanacaktır
}
}
Autoboxing Sürecinin Analizi
Bu durum için üretilen bayt kodunu incelediğinizde, aşağıdaki gibi görünecektir:
public static void main(java.lang.String[]);
Code:
0: iconst_5
1: istore_1
2: iload_1
3: invokestatic #6; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; // Burada Autoboxing gerçekleşiyor
6: invokestatic #7; //Method hello:(Ljava/lang/Integer;)V
9: return
Orijinal kodun çıktısı “Integer” olur; bu, derleyicinin ilkel değeri bir Integer nesnesine dönüştürmek için Integer.valueOf(int)
yöntemini kullandığını gösterir.
Ana Farklılıklar
Tekrar etmek gerekirse, genişletme ve autoboxing arasındaki ana farklılıklar şunlardır:
-
Genişletme:
- Daha küçük bir ilkel türü daha büyük bir ilkel türe (örneğin,
int
‘tenlong
‘a) dönüştürür. - Yeni nesne oluşturulmaz; sadece tür dönüşümü gerçekleşir.
- Daha küçük bir ilkel türü daha büyük bir ilkel türe (örneğin,
-
Autoboxing:
- Bir ilkel türü, karşılık gelen sarmalayıcı sınıfa (örneğin,
int
‘tenInteger
‘a) dönüştürür. - İlgili ilkel değeri bir nesneye sarmalayarak nesne oluşturma işlemi içerir.
- Bir ilkel türü, karşılık gelen sarmalayıcı sınıfa (örneğin,
Sonuç
genişletme
ve autoboxing
arasındaki nüansları anlamak, her Java geliştiricisi için çok önemlidir. Bu kavramları yanlış anlamak, programlarınızdaki beklenmedik davranışlara neden olabilir, özellikle yöntem aşırı yüklemesi senaryolarında. Yöntemlerinizi ve sınıflarınızı tasarlarken Java derleyicisinin bu dönüşümleri nasıl işlediğini her zaman aklınızda bulundurun ve optimal performans için dikkate alın.
Bu farklılıkları kavrayarak, daha net ve daha etkili kod yazabilir ve Java’nın tür sistemiyle çalışırken yaygın tuzaklardan kaçınabilirsiniz.