Merhaba, Java 5 (Tiger ) beraberinde dil,kütüphane, arayüz,performans özellikleri ile ilgli pek çok yenilik getirdi. Ben bu makale serisinde Java 5.0 ile gelen yeni dil özelliklerinden sırasıyla bahsetmeye çalışacağım.
Öncelikle Java 5.0 ile gelen yeni dil özellikleri nelerdir onlara bir bakalı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)
İlk makalemizde Generic sınıflardan ve metotlardan bahsedeceğiz.
C# 2.0 ile çalışmışsanız veya halen çalışıyorsanız size generic kelimesi size yabancı gelmeyecektir. Java daki generic yapılar, C# taki yapılardan çok farklı değildir.
Generic Sınıflar
Generic sınıf demek içerisinde her türlü tipi (primitive veya referans) tutabilen , hangi tipi tutacağına sınıftan bir nesne yaratılırken karar verebileceğimiz.Nesne yaratılırken belirlediğimiz tip ne olursa olsun bütün tipler için aynı işlemleri yapabilmemizi sağlayan sınıftırtır.
Örneğin bir sınıf tanımlıyoruz ve içerisinde bir başka bir sınıf barındırması(composition) gerekiyor .Fakat içerisinde barındıracağı sınıfın ne olacağına bu sınıfı yazarken yazarken değil bu sınıfı kullanırken karar vermek istiyoruz. O zaman sınıfımızı aşağıdaki gibi generic tanımlamamız gerekir.
HTML Code:
public class BizimGenericClass { private E genericDeger; public BizimGenericClass(E genericDeger) { this.genericDeger = genericDeger; } public void genericTipiYaz() { System.out.println(genericDeger.getClass().toStrin g()); } public void genericDegeriYaz() { System.out.println(genericDeger.toString()); }}
Sınıfımızı yukarıdaki gibi tanımlarsak artık içerisinde hangi tipten bir nesne tutacağımıza bu sınıftan nesne yaratırken karar verebiliriz.Yukarıdaki kodda yazdığımız sınıf içinde tutacak olduğumuz değişkenin tipine karşılık geliyor.Yani BizimGenericClass sınıfından nesne yaratırken yerine yazdığımız tipte bir değişken tutacağımız anlamına geliyor. yerine herhangi bir değişken adı yazabiliriz (,... gibi) değişken isminin bir önemi oktur. gösterimi sadece genel bir tipi temsil eder.
Generic sınıflardan nesne yaratmak normalden biraz farklıdır;
BizimGenericClass bizimnesne = new BizimGenericClass();
Burada sınıf tanımındaki yerine koyuyoruz bu bizimnesne adlı nesne içerisinde String tutacağımız anlamına gelir. Eğer yerine herhangi bir tip yazmazsak bu sınıf içerisinde Object tipini saklayacağımız anlamına gelir.
Aşağıdaki kod bu generic sınıfı nasıl kullanacağımızı açıklamaktadır
HTML Code:
public class MainProgram { public static void main(String[] args) { BizimGenericClass s = new BizimGenericClass("Ayhan"); //generic classın hangi nesneyi tutacağını burada belirtiyoruz s.genericTipiYaz(); s.genericDegeriYaz(); BizimGenericClass t = new BizimGenericClass(;//generic classın hangi nesneyi tutacağını burada belirtiyoruz t.genericTipiYaz(); t.genericDegeriYaz(); }}
Generic Metotlar
Generic metotlar ise yukarıda kullandığımız generic sınıftaki yapıcı (constructor) metot gibi yazılmaktadır.
Aşağıda generic metot tanımıyla ilgili kısa bir örnek yeralmaktadır;
HTML Code:
public class YeniGenericClass { public void BizimGenericMethod(T genericDeger) { System.out.println(generi.getClass().toString()); System.out.println(generi.toString()); }}
Generic metot yazarken dikkat edilmesi gereken tek şey 3. satırdaki (metot tanımındaki ) T genel tipinin metodu içeren YeniGenericClass sınıfın 1. satırında sınıf isminden sonra yazılan ile aynı olmasıdır.
Kullanırken yine generic sınıf gibi kullanacağız.
HTML Code:
public class MainProgram { public static void main(String[] args) { YeniGenericClass y = new YeniGenericClass(); y.BizimGenericMethod("Hello Generic Method"); }}
Java 5.0 Generic Koleksiyon yapıları
Şimdi kendimiz generic sınıf ve metot yazmak yerine Java 5.0 ile gelen işlerimizi kolaylaştırmak için yazılmış generic koleksiyonları nasıl kullanacağımızı görelim.
Öncelikle eskiden Java da koleksiyon(Collection) yapılarını kullanırken eskiden (Java 5.0 dan önce) nasıl bir problemimiz olduğunu görelim.
Bir koleksiyon kullanmak için tanımını yapıp "new" anahtar kelimesiyle yani bir nesne yaratmamız gerekiyor. Daha sonra bu koleksiyon nesnesinin içerisine istediğimiz nesneleri "add()" methodunu kullanarak ekleyebiliyoruz. Aşağıdaki kodda yeni bir vektör nesnesi yaratılıp içerisine istediğimiz nesneleri ekliyoruz. (NOT: Unutmayın koleksiyon yapıları içerlerinde sadece nesne tuabilirler primitive tip tutamazlar)
HTML Code:
import java.util.Vector; //Kullanacağımız koleksiyon classını import ediyoruzpublic class MainProgram {public static void main(String[] args) { Vector v = new Vector(); //Yeni bir vektör nesnesi yaratıyoruz String isim = "AYHAN"; Integer no = new Integer(888); v.add(isim); //vektör koleksiyonumuza isim değişkenini ekliyoruz. v.add(no); //vektör koleksiyonumuza no nesnesini ekliyoruz ekliyoruz. String name = (String)v.elementAt(0); //Type Casting (5.0 dan önce tür dönüşümü işlemini mutlaka yapmamız gerekiyordu) Integer id = (Integer)v.elementAt(1); //Type Casting (5.0 dan önce tür dönüşümü işlemini mutlaka yapmamız gerekiyordu) }}
Aslında yukarıdaki kodda şu ana kadar bir problem yok.Problemimiz koleksiyon nesnelerinin içerisine koyduğumuz nesneleri geri almaya çalıştığımızda olacak.Koleksiyon nesneleri içerisine aldıkları bütün nesneleri "Object" tipinde tuttukları için geri almaya kalktığımızda bize bir "Object" nesnesi geridöndürecek. Bu durumda bizim bir tür dönüşümü (type casting) işlemi yapmamız gerekiyor.Her geri alacağımız nesne için maalesef bu işlemi tekrar tekrar yapacağız.
Yukaridaki kodda 12. satırda "elementAt()" metodunu kullanarak koleksiyona koyduğumuz "AYHAN" stringini geri almaya çalışıyoruz."elementAt()" metodu bize nesne geri döndürdüğü için mecburen bir tür dönüşümü işlemi yapmak zorunda kaldık. Tür dönüşümü işlemini yapmasaydık derleme sırasında hata alacaktık.Koleksiyonumuzun tüm elemanlarının anı tipte olsaydı bile yine tür dönüşümü yapmak zorundaydık. Aslında görüldüğü gibi tür dönüşümü yaptığımız sürece hiçbir problemimiz yok.İsterseniz Java 5.0 kullandığınız halde hala bu yöntemle uygulama geliştirmeye devam edebilirsiniz , bir problem çıkmaz.
Ama işlerimizi kolaylaştırmak istiyorsak (özellikle koleksiyonda aynı türden nesneler tutuyorsak) Generic koleksiyon yapılarını kullanmamız gerekecek.
Java 5.0 dan önce var olan kolaksiyon sınıfları Java 5.0 için generic sınıflar olarak tekrar yazılmıştır.Generic koleksiyon sınıfları sayesinde koleksiyonun içinde ne tür nesneler tutacağımızı önceden belirtip içerisine nesnelerimizi koyuyoruz. Geri alırken herhangi bir tür dönüşümü işlemi yapmamıza gerek kalmıyor.
Örnek ;
HTML Code:
import java.util.Vector; public class MainProgram {public static void main(String[] args) { Vector v = new Vector(); String isim = "AYHAN"; String soyisim="OZTURK"; v.add(isim); v.add(no); String name = v.elementAt(0); //String tutacağımızı önceden belirttiğimiz için tür dönüşümü yapmamıza gerek kalmıyor . String lastname = v.elementAt(1); }}
Fakat yukarıdaki örnektede görüldüğü gibi koleksiyonumuzun hangi tipi tutacağını koleksiyon nesnesini yaratırken söylüyoruz.Bu yüzden içerisine o tipten başka bir tip koyamıyoruz. Örneğin string vektörünün içerisine Integer koyamıyoruz.
Bu makale serisinin ikincisinde Autoboxing/Unboxing konusundan bahsedeceğim. Görüşmek üzere.
Bilgiyi paylaşalım....