Java Bilgileri | Bölüm 7

MegaCrafter

Obsidyen Madencisi
Mesajlar
1,419
En iyi cevaplar
0
Beğeniler
1,542
Puanları
3,070
Sonunda bir devam konusu. Bu bölümde Generics sistemini öğrenicez. Başlayalım!

Generics dediğimiz şeyi çok kullandığınıza eminim. Ama bunun farkında değilsinizdir. Bu Java 5 ile eklenen bir şeydi. Bir örnek vereyim bununla ilgili:
Kod:
ArrayList<String> örnek;
Buradaki "<String>" bölümü Generics dediğimiz kavrama giriyor. Yani <> işaretleri içinde bir tanım. Mesela siz bir kutu class'ı oluşturmak istiyorsunuz. Ama bunun ne içinde tutacağını nasıl bileceksiniz? İşte burada devreye giriyor Generics. Kısaca "Kutu<Integer>" yazarak içinde Integer bulunduracağını bilebileceksiniz. Casting dediğimiz şeye de biraz yardımcı. Mesela:
Kod:
class Kutu {
    Object nesne; // Object kullanıyoruz çünkü kutunun ne içereceğini bilmiyoruz.

    Kutu(Object nesne) {
        this.nesne = nesne;
    }

    Object nesneyiAl() {
        return nesne;
    }
}

class Örnek {
    public static void main(String[] args) {
        Kutu kutu = new Kutu("Örnek");
        String yazı = (String) kutu.nesneyiAl(); // Cast yapmamız gerekiyor.
        System.out.println(yazı); // Çıktımız "Örnek" olacak.
    }
}
Burada Cast yapmamız gereken yeri yapmazsak hata verir. Çünkü bu metod bize bir Object döndürüyor. String class'ı da Object class'ını örnek almadığı için Java Object'i kendi kendine String'e dönüştüremiyor. Biz bunun bir String olduğunu bildiğimiz için bunun bir String olduğunu söylüyoruz ve dönüştürmüş oluyor. Ama bunu daha mantıklı bir biçimde yapabilirdik. Hadi baştan yazalım hepsini. Ama bu sefer Generics kullanalım.
Kod:
class Kutu<T> {
    T nesne;
    Kutu(T nesne) {
        this.nesne = nesne;
    }

    T nesneyiAl() {
        return nesne;
    }
}
Etraf T'lerle doldu. Biliyorum. Buna alışmanız gerek. Kısaca en üstte <T> yerine verilen şeyi kullanıyor diğer yerlerde. Yani biz Örnek class'ı içinde kutumuza <String> verirsek, T yazan her yer String olarak değişecektir. Artık bunun String olduğunu bildiğimiz için de "(String)" Cast'ini yapmamız gerekmeyecek. Biraz kafanız karışmış olabilir. Yapabileceğim bir şey yok. Neyse. Biraz özelliklerden bahsedelim.
Kod:
class Kutu<T extends Entity>
Eğer buradaki gibi "extends" eklersem, verdiğim şeyin Entity'yi örnek almasını bekler. Mesela bukkit içinde Player class'ı Entity'yi örnek alıyor. Player verirsek bir sorun çıkmaz bu yüzden. Ama tutar da String verirseniz hata verecektir.

Ayrıca burada T kullanmamızın bir sebebi var. İlla T kullanmanız gerekmiyor. Ama biz T kullanıyoruz. Çünkü T demek "Type" demektir. Yani bir class istemesi demek. Diğerlerini de listeledim ben:
Element (E): Bunu Java kendi kütüphanesinde özel kullanıyor. Tam olarak ne işe yaradığını kendi de belirtmemiş.
Key (K): Bir anahtar istemesini sağlar. Hashmap içerisindeki anahtar ve değer sisteminde kullanılır.
Number (N): Bir sayı istemesini sağlar. Mesela Kutu<2> gibi bir şey söyleyebilirsiniz bu sayede.
Value (V): Bir değer istemesini sağlar. Yine HashMap içerisinde kullanılıyor.
Bu K ve V 'nin kullanılması aslında bir şey değiştirmiyor. Yine sizden Class istiyor. Ama bir sebebi var. Eğer class'ınız 2 tane Generics alacaksa bu ikisini kullanmak zorundasınız. İkisine de T yazamazsınız. Bu özellikle düşünülmüş bir şeydir.

Ayrıca metodlar için de Generics kullanabilirsiniz. Aynı class gibi T dediğiniz yerleri class'a verilen değerle doldurur. Bu normalde kendi kendine olan bir şey. Mesela Kutu class'ının içine şunu eklediğimizi düşünün:
Kod:
public static <T> Kutu<T> yeniKutu(T nesne) {
    return new Kutu<T>(nesne);
}
<T> yazdığımız için bu artık bir Generics metodu. Biz buna String verirsek, bizden String isteyecek ve bize "Kutu<String>" döndürecektir. Class'ın başındaki ile bağımsız olarak çalışır. Bu metoda String vermenin 2 yolu var.
Kod:
Kutu<String> örnek = Kutu.<String>yeniKutu("örnek");
Metoddan öncesinde ekliyorsunuz kısaca. Bu iğrenç gözüküyor. Ama bunu yazmasanız da olur :D
Kod:
Kutu<String> örnek = Kutu.yeniKutu("örnek");
yeniKutu metoduna zaten String verdiğimiz için kendisinin bir String olduğunu anlayacak kadar zekidir. Ben buna bayılıyorum. Her neyse. Bitirelim burada. elim titremeye başladı yazmaktan.

Umarım bir yanlışlık yapmamışımdır ve beğenmişsinizdir. Normalde Stream, Lambda ve Method Reference'i de gösterecektim. Ama Stream olmadan anlatmak biraz zor ve Stream de kaldırılmış. Onları boşverin zaten. Ne yapacaksınız siz? Aklıma fikir geldikçe bu bilgiler bölümlerini yapmaya devam edicem ama pek kolay değil maalesef. Diğer bölümlere "Java Bölümü" forum sayfasından erişebilirsiniz. Şimdilik bu kadar. Görüşürüz.

@GodofMilker Al sana zorluk ayarlaması :D
 


Jacops

Bedrock Kaşifi
Mesajlar
1,656
En iyi cevaplar
0
Beğeniler
1,636
Puanları
4,700
Ruh hali
Çok güzel konuların var java öğrenmeye çalışanlara iyi rehber olur :)
 

GodofMilker

Nether Yerlisi
Mesajlar
2,196
En iyi cevaplar
0
Beğeniler
2,562
Puanları
6,790
Pf değişkenlerden daha kolay bu .s
 

Üst