Hızlı Konu Açma

Hızlı Konu Açmak için tıklayınız.

Son Mesajlar

Konulardaki Son Mesajlar

Reklam

Forumda Reklam Vermek İçin Bize Ulaşın

Java 5.0 (Tiger) ile Gelen Dil Yenilikleri 2 : Autoboxing/Unboxing

YaSa22

Fahri Üye
Fahri Üye
Katılım
12 Temmuz 2014
Mesajlar
2,293
Tepkime puanı
2
Puanları
0
Konum
GTA
Merhaba, bir önceki yazımda Java 5.0 ile gelen yeni dil özelliklerinden biri olan Generic yapılardan bahsetmiştim.İkinci olarak Autoboxing ve Unboxing konusunda bilgi vermeye çalışacağım.

Öncelikle Java 5.0 ile gelen yeni dil özellikleri nelerdir tekrar hatırlayalım;

  • Generic yapılar
  • Autoboxing/Unboxing
  • Gelişmiş for döngüsü
  • Typesafe Enum (Güvenli sıralama yapıları)
  • Varargs (Değişken sayıda argüman)
  • Static Import
  • Metadata (Annotations)


Java programlama dilinde iki tür değişken tipi vardır, İlkel tipler (Primitive Types) ve referans tipleri (Reference Types). Java programlama dilinde, C# dilinde var olan struct yapısi gibi değer tipi (Value Type ) olarak bildiğimiz yapılar yoktur.

İlkel Tipler

İlkel tipleri hepimiz biliyoruz, sayısal veya boolean değerler tutuğumuz en temel tiplerimizdir (byte, int, short, long, char, float ve double gibi ).İlkel tipler hafızanın stack bölümünde yar alırlar.Bir metoda değişken olarak geçildiğinde bir kopyası alınıp kopyası üzerinden işlem yapılır, dolayısı ile mevcut değer değişmemiş olur.
Aşağıdaki kodu denediğinizde x değerinin değişmediğini göreceksiniz;
public class PrimitiveType
{
public static void main(String[] args)
{
int x = 100;
System.out.println("Deger Arttir Methodundan Once = " + x);
degerArttir(x);
System.out.println("Deger Arttir Methodundan Sonra = " + x);
}

public static void degerArttir(int deger)
{
deger += 20;
}
}


Referans Tipleri

Referans tipleri sınıflar ve arraylar dir. Referans tipleri değer tiplerinin aksine metodlara geçtiğimizde kopyaları üzerinden işlem yapılmazlar, mevcut nesneler üzerinden işlem yapılırlar.Bu yüzden yukarıdaki kodu x değerini kendi yazdığımız bir referans tipi (DenemeSinifi) içerisinde koyup bir metot aracılığı ile değerini arttırdıktan sonra tekrar ekrana yazdırırsak x değerinin değişmiş olduğunu göreceğiz;
public class MainProgram
{
public static void main(String[] args)
{
DenemeSinifi d = new DenemeSinifi();
d.x = 100;
System.out.println("Deger Arttir Methodundan Once = " + d.x);
degerArttir(d);
System.out.println("Deger Arttir Methodundan Sonra = " + d.x);
}

public static void degerArttir(DenemeSinifi d)
{
d.x += 20;
}
}

class DenemeSinifi
{
public int x;
}

Yukarıdaki kodda yaptığımız işleme sarmalama (wrapping) işlemi denilmektedir.
Java da program yazarken bazen ilkel tiplerin yukarıdaki gibi başka bir sınıf tarafından sarmalanmasına ihtiyaç duyarız. Özellikle kolleksiyon (collections) sınıfları ile çalışıyorsak bu kaçınılmazdır.
Bunun sebebi kolleksiyon nesneleri içerlerinde sadece nesne (object) tutabilirler. Eğer biz bir kolleksiyon nesnesinin içerisinde bir ilkel tip tutmak istiyorsak mecburen o ilkel tipi başka bir sınıf ile sarmalamamız gerekecek. Bu yüzden Java da java.lang paketinin (package) altında her ilkel tip için bir sarmalayıcı (wrapper classes) sınıf vardır.
Primitive typeWrapper class
byte

Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun

short

Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun

int

Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun

long

Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun

float

Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun

double

Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun

char

Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun

boolean

Linkleri sadece kayıtlı üyeler görebilir. Linkleri görebilmek için Üye Girişi yapın veya ücretsiz olarak Kayıt Olun


Bir ilkel tipi bir sarmalayıcı (wrapper class) sınıf içerisine koyma işlemine Boxing (kutulama), sarmalıyıcı sınıfın içerisinden ilkel tipi geri alma işleminede Unboxing (kutudan çıkarma) işlemi denilmektedir.
int x = 100;
Integer box = new Integer (x); //BOXING
int y = box.intValue(); //UNBOXING

Aşağıdaki kod örneğinde bir vektör içerisinde int değerleri ekliyoruz.
import java.util.Vector;

public class VektorDeneme
{
public static void main(String[] args)
{
Vector v = new Vector();
int x = 100;
int y = 200;
int z = 300;
Integer xwrap = new Integer(x); //Boxing
Integer ywrap = new Integer(y); //Boxing
Integer zwrap = new Integer(z); //Boxing
v.add(xwrap);
v.add(ywrap);
v.add(zwrap);
}
}

Java 5.0 dan önce her sarmalayıcı (wrapper) sınıf kullandığımızda mecburen boxing ve unboxing işlemi yapmak zorundaydık.Fakat Java 5.0 ile artık bunu yapmak zorunda değiliz.Çünkü bu işlem Java 5.0 tarafından otomatik olarak yapılıyor.
Yani ilkel tipleri nesne gibi , sarmalayıcı sınıfından yaratılan nesneleride ilkel tipler gibi kullanabiliyoruz. Birbirleri arasındaki dönüşümler otomatik olarak yapılıyor.

Aşağıdaki kod örnekleri Java 5.0 dan önce hangi durumlarda hatalarla karşılaşacağımızı göstermektedir.
import java.util.Vector;

public class Ornekler
{
public static void main(String[] args)
{
Integer i = new Integer(100);
i++; //ERROR 1

Integer x = new Integer(12);
Integer y = new Integer(13);
Integer z = x + y; //ERROR 2

int a = new Integer(99); //ERROR 3
Integer b = 555; //ERROR 4

int w = 100;
Vector v = new Vector();
v.add(w); //ERROR 5

int k = 777;
Integer l = new Integer(333);
int m = k + l; //ERROR 6
}
}

Yukarıdaki kodu kopyalayıp Java 1.4 ile derlemeye çalışırsanız ERROR satırlarında boxing ve unboxing işlemlerini yapmadığınız için çeşitli hatalar alırsınız.

Hataların sebeplerini kısaca açıklayacak olursak;
ERROR 1 : Bir nesnenin değerini arttırmak için ++ operatörünü kullanamayız, bunu yapabilmek için i nesnesini int dönüştürmemiz (unboxing) gerekir.
ERROR 2 : İkin nesneyi + operatörü ile toplayamayız önce unboxing işlemi yapmamız gerekir.
ERROR 3 : İlkel bir tipe nesne ataması yapamayız.
ERROR 4 : Bir nesneye ilkel değer atayamayız. New anahtar kelimesi ile nesne yaratmamız gerekir.
ERROR 5 : Kolleksiyon nesnelerinin içerisinde ilkel tipler tutamayız.
ERROR 6 : Bir ilkel tiple nesneyi toplayamayız.

Fakat aynı kodu Java 5.0 ile derlerseniz hiçbir hata ile karşılaşmazsınız, sebebi Boxing veya Unboxing işlemlerinin gereken yerlerde Java 5.0 ile gelen Autoboxing/Unboxing özelliği sayesinde otomatik olarak yapılıyor olmasıdır.

Önemli Nokta;

Wrapper sınıflar immutable (değişmez) özelliğe sahiptirler, sıradan nesneler gibi davranmazlar.
Mesela; yukarıda ikinci yazmış olduğumuz kodda eğer DenemeSinifi yerine bir Integer wrapper sınıfını kullansaydık yine değerimiz ilkel tiplerde olduğu gibi değişmeyecekti. Çünkü immutable nesneler metotlara değişken olarak geçildiğinde kopyalarıı üzerinden işlem yapılır.
public class MainProgram
{
public static void main(String[] args)
{
Integer d = new Integer();
d = 100;
System.out.println("Değer Arttır Methodundan Once = " + d);
degerArttir(d);
System.out.println("Değer Arttır Methodundan Sonra = " + d); //d değeri değişmez
}
}

Yukarıdaki kodun son satrırında d bir referans tipi olduğu için değerinin ikinci örnekte olduğu gibi değişmiş olmasını bekliyoruz fakat sarmalıyıcı (wrapper) sınıflar immutable (değişmez değerli) oldukları için d nesnesinin değeri değişmemektedir.

Görüşmek üzere.
 

Users Who Are Viewing This Konu (Users: 0, Guests: 1)

Üst