java generics tutorial with examples
Java Generics, Veri Türünden Bağımsız Olarak Kod Yazmanıza İzin Veren Bir Özellikler Dizisidir. Bu makale Java Generics'i Örneklerle Ayrıntılı olarak açıklamaktadır:
Jenerikler, Java'nın önemli özelliklerinden biridir ve Java 5'ten itibaren tanıtılmıştır.
Tanım olarak, Generics, programcının Genel türleri ve işlevleri kullanmasına izin veren ve böylece tür güvenliğini sağlayan bir dizi Java dili özelliğidir.
Ne öğreneceksin:
Java'da Jenerikler Nasıl Çalışır?
Daha önce C ++ ile çalıştıysanız, Java Generics, C ++ 'daki şablonlarla aynıdır. Java Generics, sınıf / yöntem tanımınıza ilkel bir veri türünün değerine sahip olacak bir parametre eklemenize izin verir.
Örneğin, Aşağıdaki gibi bir Generic sınıfı 'Array' olabilir:
Sınıf Dizisi {….}
Parametreli tür nerede.
int için c ++ karakter
Ardından, bu sınıf için aşağıdaki gibi nesneler oluşturabilirsiniz:
Array int_array = new Array () Array char_array = new Array ();
Dolayısıyla, Generic parametreleştirilmiş bir sınıf verildiğinde, aynı sınıftaki nesneleri parametre olarak farklı veri türleriyle oluşturabilirsiniz. Java Generics kullanmanın temel özü budur.
Benzer şekilde, bir diziyi sıralamak için parametreli bir türe sahip genel bir yöntem yazabilir ve ardından bu yöntemi herhangi bir ilkel türe örnekleyebilirsiniz.
Java Generics, çoğunlukla Java'nın koleksiyon çerçevesi ile kullanılır. LinkedList, List, Map, HashMap vb. Gibi farklı koleksiyonlar uygulama için Generics kullanır. Tür kontrolü derleme zamanında yapıldığından jenerikler tür güvenliği sağlar ve böylece kodunuzu daha kararlı hale getirir.
Şimdi, Jenerik sınıfların ve yöntemlerin ayrıntılarının yanı sıra diğer ilgili konulara daha fazla girelim.
Genel Sınıflar
Generic sınıf, sınıf adının ardından köşeli parantez içinde bir tür gelmesi dışında normal bir sınıfla aynıdır.
Generic sınıfının genel tanımı aşağıdaki gibidir:
sınıf sınıf_adı
{
sınıf değişkenleri;
… ..
sınıf yöntemleri;
}
Sınıf tanımlandıktan sonra, aşağıdaki gibi istediğiniz herhangi bir veri türünde nesneler oluşturabilirsiniz:
class_name obj = new class_name ();
Örneğin, Tamsayı nesnesi için bildirim şöyle olacaktır:
class_name obj = new class_name;
Benzer şekilde, String veri türü için nesne şöyle olacaktır:
class_name str_Obj = new class_name;
Generic sınıfı için örnek bir uygulama aşağıda gösterilmiştir.
class MyGenericClass { T obj; void add(T obj) { this.obj=obj; } T get() { return obj; } } class Main { public static void main(String args()) { MyGenericClass m_int=new MyGenericClass(); m_int.add(2); MyGenericClassmstr=new MyGenericClass(); mstr.add('SoftwaretestingHelp'); System.out.println('Member of MyGenericClass:' + m_int.get()); System.out.println('Member of MyGenericClass:' + mstr.get()); } }
Çıktı:
Yukarıdaki programda, MyGenericClass sınıfı genel bir sınıftır. Eklemek ve almak gibi iki yöntemi vardır. Add yöntemi, genel nesneyi başlatırken, get yöntemleri nesneyi döndürür.
Ana işlevde, her biri Tamsayı ve Dize türünde iki nesne bildiriyoruz. Bu nesnelerin ikisini de add yöntemini kullanarak ilgili başlangıç değerleriyle başlatıyoruz ve daha sonra bu nesnelerin içeriklerini get yöntemini kullanarak çıkarıyoruz.
Yukarıdaki Generic sınıf örneğini bir tür parametresi ile sunduk. Fakat gerçekte, bir sınıfın birden fazla tip parametresi de olabilir. Bu durumda, tür parametreleri virgülle ayrılır.
Aşağıdaki örnek bunu göstermektedir:
classTest_Generics { T1 obj1; // An object of type T1 T2 obj2; // An object of type T2 // constructor to initialise T1 & T2 objects Test_Generics(T1 obj1, T2 obj2) { this.obj1 = obj1; this.obj2 = obj2; } public void print() { System.out.println('T1 Object:' + obj1); System.out.println('T2 Object:' + obj2); } } class Main { public static void main (String() args) { Test_Genericsobj = newTest_Generics('Java Generics', 1); obj.print(); } }
Çıktı:
Bu programda T1 ve T2 olmak üzere iki tip parametremiz var. Üye nesneleri başlatmak ve ayrıca içerikleri yazdırmak için işlevlerimiz var. Ana işlevde, String ve Integer olmak üzere iki türe sahip bir nesne bildiriyoruz. Programın çıktısı, oluşturulan nesnenin içeriğini gösterir.
Tıpkı sınıflar gibi, Genel arayüzlere de sahip olabilirsiniz. Arayüzler hakkında her şeyi ayrı bir konuda öğreneceğiz.
Java Genel Yöntemleri
Genel sınıflara ve arabirimlere sahip olabileceğiniz gibi, tüm bir sınıfın Genel olması gerekmemesi durumunda Genel yöntemlere de sahip olabilirsiniz.
Aşağıdaki program, “printGenericArray” Genel yönteminin uygulanmasını göstermektedir. Ana işlevdeki yöntem çağrısına dikkat edin. Burada Generic metoda iki çağrı yapıyoruz, önce tip ile ve sonra tip ile.
public class Main{ public static void printGenericArray(T() items) { for ( T item : items){ System.out.print(item + ' '); } System.out.println(); } public static void main( String args() ) { Integer() int_Array = { 1, 3, 5, 7, 9, 11 }; Character() char_Array = { 'J', 'A', 'V', 'A', 'T','U','T','O','R','I','A', 'L','S' }; System.out.println( 'Integer Array contents:' ); printGenericArray(int_Array ); System.out.println( 'Character Array contents:' ); printGenericArray(char_Array ); } }
Çıktı:
Sınırlı Tür Parametreleri
Generics'te veri türlerini sınırlamak istediğinizde Sınırlı Tür Parametreleri devreye girer. Örneğin, Belirli bir genel sınıf veya yöntem veya yalnızca sayısal veri türleri için çalışması gereken herhangi bir arabirim istiyorsanız, bunu 'extends' anahtar sözcüğünü kullanarak belirtebilirsiniz.
Bu aşağıda gösterilmiştir:
List myList = new ArrayList(); List list1 = new ArrayList();
Long ve Integer Number'ın alt sınıfları olduğu için yukarıdaki iki bildirim derleyici tarafından kabul edilecektir.
Ancak bir sonraki açıklama bir sorun olacak.
List list = new ArrayList();
Bu derleme zamanı hatası verir çünkü String bir Sayı değildir. Yukarıdaki örnekteki '?' Sembolü joker karakter olarak bilinir ve bundan sonra bunu tartışacağız.
Bu nedenle, genel olarak, sınırlı tür parametreleri çoğunlukla, jenerik kodunuzda kullanılacak veri türlerini kısıtlamak istediğinizde kullanılır.
Java Jenerik Joker Kartı
Java'da, bir Joker Karakter, bilinmeyen bir türü belirtmek için kullanılan bir soru işareti olan '?' İle gösterilir. Joker karakterler çoğunlukla parametre türü olarak jeneriklerle kullanılır.
Genel Joker Karakterleri kullanırken, nesnenin diğer tüm sınıfların üst sınıfı olmasına rağmen, nesnelerin koleksiyonunun ( Örneğin, List) diğer tüm koleksiyonların bir üst sınıfı değildir.
Bir parametre türü olarak kullanılmasının yanı sıra, bir alan, yerel bir değişken ve benzeri olarak bir joker karakter kullanabilirsiniz. Ancak, joker karakteri hiçbir zaman bir üst tür olarak veya genel yöntemi çağırmak için bir tür bağımsız değişkeni olarak veya genel bir sınıfın bir örneğinin oluşturulması durumunda kullanamazsınız.
Aşağıda gösterildiği gibi joker karakter parametreli türlerin (burada en az bir tür bağımsız değişkeni bir joker karakterdir) birçok örneği vardır ve farklı yerlerde kullanılan joker karakterler farklı şekilde yorumlanacaktır:
- Toplamak <: Koleksiyon, kullanılan tür bağımsız değişkenine bakılmaksızın tüm koleksiyon arabirimi somutlaştırmasını belirtir.
- Liste extends Number< : Liste, eleman türünün bir sayı olacağı tüm liste türlerini temsil eder.
- Karşılaştırıcı: Stringsupertypes olan tür bağımsız değişkenleri için tüm karşılaştırıcı arabirim örnekleri.
Joker Karakterle Parametrelenmiş türün, geçerli türleri tanımak için uygulanan bir kural olduğuna dikkat edin. Somut bir veri türü değildir. Genel Joker Karakterler sınırlı veya sınırsız olabilir.
# 1) Sınırsız Joker Karakterler
Sınırsız Joker Karakterlerde, tür değişkenleri üzerinde herhangi bir kısıtlama yoktur ve aşağıdaki şekilde gösterilir:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) Sınırlı Joker Karakterler
Sınırlı türleri zaten tartıştık. Bunlar, anahtar sözcükleri - extends veya super kullanarak tür parametrelerini somutlaştırmak için kullanılan veri türüne kısıtlamalar getirir. Bu joker karakterler ayrıca Yukarı Sınırlı Joker Karakterler ve Aşağı Sınırlı Joker Karakterler olarak bölünebilir.
- Üst Sınırlı Joker Karakterler
Genel ifadenizin belirli bir türdeki tüm alt sınıflar için geçerli olmasını istiyorsanız, o zaman extends anahtar sözcüğüyle birlikte Upper Bounded Wildcard'ı belirtirsiniz.
Örneğin, List, List vb. destekleyen genel bir yönteme ihtiyaç duyduğunuzu varsayalım, bu durumda Üst Sınırlı Joker Karakter belirtebilirsiniz. Liste . Number bir üst sınıf olduğundan, bu genel yöntem tüm alt sınıfları için çalışacaktır.
Aşağıdaki program bunu göstermektedir.
importjava.util.*; public class Main { private static Number summation (List numbers){ double sum = 0.0; for (Number n : numbers) sum += n.doubleValue(); return sum; } public static void main(String() args) { //Number subtype : Integer Listint_list = Arrays.asList(1,3,5,7,9); System.out.println('Sum of the elements in int_list:' + summation(int_list)); //Number subtype : Double List doubles_list = Arrays.asList(1.0,1.5,2.0,2.5,3.0,3.5); System.out.println('Sum of the elements in doubles_list:' + summation(doubles_list)); } }
Çıktı:
Burada bir üst sınır joker karakterini sağladık: 'toplama' fonksiyonunun tür argümanına Liste. Ana işlevde, iki liste tanımlarız, yani Integer türünde int_list ve Double türünde doubles_list. Tamsayı ve Çift, Number'ın alt sınıfları olduğundan, işlev toplamı bu iki listede de mükemmel şekilde çalışır.
- Alt Sınırlı Joker Karakterler
Genel ifadenin belirli bir türün tüm üst sınıflarını kabul etmesini istiyorsanız, tür bağımsız değişkeniniz için bir Alt Sınırlı Joker Karakter belirtebilirsiniz.
Bunun için örnek bir uygulama aşağıda verilmiştir:
importjava.util.*; class Main { public static void main(String() args) { //Integer List ListInt_list= Arrays.asList(1,3,5,7); System.out.print('Integer List:'); printforLowerBoundedWildcards(Int_list); //Number list ListNumber_list= Arrays.asList(2,4,6,8); System.out.print('Number List:'); printforLowerBoundedWildcards(Number_list); } public static void printforLowerBoundedWildcards(List list) { System.out.println(list); } }
Çıktı:
Bu programda belirtilen Alt Sınırlı Joker Karakter 'Liste' dir. Daha sonra ana işlevde bir tür listesi ve bir liste var. Alt Sınırlı Joker Karakter kullandığımız için, Number sınıfı bir tamsayı üst sınıfıdır, geçerli bir tür bağımsız değişkendir.
Java Jeneriklerinin Avantajları
# 1) Tip Güvenliği
Jenerikler, Tip Güvenliği sağlar. Bu, tür denetiminin çalışma zamanında değil derleme zamanında yapıldığı anlamına gelir. Bu nedenle, doğru türler kullanılacağından, çalışma zamanı sırasında 'ClassCastException' alma şansı yoktur.
importjava.util.*; class Main { public static void main(String() args) { List mylist = new ArrayList(); mylist.add(10); mylist.add('10'); System.out.println(mylist); List list = new ArrayList(); list.add(10); list.add('10');// compile-time error System.out.println(list); } }
Yukarıdaki programda, biri jenerik içermeyen ve diğeri jenerikli olmak üzere iki liste var. Jenerik olmayan listede Tip Güvenliği yoktur. Eleman olarak bir tamsayı, dize vb. Ekleyebilirsiniz ve kabul edilir.
Genel listede, genel ifadede belirtilen yalnızca bir tür öğe ekleyebilirsiniz. Başka türde bir öğe eklemeye çalışırsanız, derleme zamanı hatasıyla sonuçlanır.
Yukarıdaki programda derleme zamanı hatası şu satırda yanıp söner:
salesforce yönetici röportajı soruları ve cevapları pdf
list.add('10');
# 2) Kodun Yeniden Kullanılabilirliği
Generics'i kullanarak her veri türü için ayrı kod yazmanıza gerek yoktur. Tek bir sınıf veya yöntem vb. Yazıp tüm veri türleri için kullanabilirsiniz.
# 3) Yazmaya Gerek Yok
Siz Generics'i kullandığınız için, derleyici kullanılan türleri bilir, bu durumda yazım yapmaya gerek yoktur.
Aşağıdaki kodu göz önünde bulundurun:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
Normal bir liste kullanıldığında görebileceğiniz gibi, liste elemanını yukarıdaki mystr için yapıldığı şekilde uygun tipine yazmanız gerekir.
Şimdi aynı kodu genel bir liste ile tekrar yazalım.
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
Burada, dizge tipini liste bildirimi için genel bir ifade olarak belirledik. Bu nedenle, bu listenin tek tek öğelerini almak için typecast'e ihtiyacımız yoktur.
# 4) Genel Algoritmaları Uygulayın
Kodlamak için Generics'i kullandığınızda çok daha fazla Generic algoritması uygulayabilirsiniz.
# 5) Derleme Zamanı Kontrolü
Daha önce belirtildiği gibi, Java programınızda Generics'i kullandığınızda, derleyici türleri derleme zamanında kontrol eder ve böylece programın çalışma zamanında anormal sonlandırılmasını önler.
Sıkça Sorulan Sorular
S # 1) Java'da neden Generics kullanıyoruz?
Cevap: Jenerikler tip bağımsızlığını sağlar, yani bir sınıf / arayüz / metot vb. Tanımlarken bir tip parametresi sağlayabiliriz, böylece gerçek örnekleme sırasında gerçek tipi belirleyebiliriz. Bu şekilde, kodun yeniden kullanılabilirliğini de sağlıyoruz.
S # 2) Jenerikler Java'da önemli mi?
Cevap: Evet. Aslında Jenerikler, tür güvenliğini, yani derleme zamanı tür kontrolünü sağlamak için Java'nın en önemli özellikleridir.
S # 3) Java, Generics'i ne zaman ekledi?
Cevap: Java'da derleme zamanı tür güvenliğini sağlamak amacıyla jenerikler 2004'te J2SE 5.0 ile Java'ya eklenmiştir.
S # 4) Genel tür nedir?
Cevap: Genel tür, bir tür parametresiyle sağlanan Genel Sınıf, Arayüz veya Yöntemdir. Bu, tip güvenliğine ve kodun yeniden kullanımına izin verir.
S # 5) Java'da Generics'i Array ile kullanabilir miyiz?
Cevap: Hayır. Java, genel dizilere izin vermez.
Sonuç
Bu, son Java sürümlerindeki en önemli özelliklerden biri olarak kabul edilen Java jenerikleri hakkındaki öğreticiyi sonlandırıyor. Java programlarında Generics kullanmak, kodun yeniden kullanılmasının yanı sıra tür güvenliğini de sağlar. Ayrıca, programın çalışma zamanında bozulmaması için derleme zamanı denetimi sağlar.
Java jenerikleri, çoğunlukla bu serideki başka bir öğreticide ayrıntılı olarak tartışacağımız Java koleksiyonları arayüzüyle kullanışlıdır.
Mutlu Okumalar !!
Önerilen Kaynaklar
- Geliştirme, Derleme, Profil Oluşturucu, Kod Kapsamı ve İnceleme için 15 En İyi JAVA Araçları
- Java Collections Framework (JCF) Eğitimi
- Java DataTypes, Loops, Arrays, Switch ve Assertions
- Java Dağıtımı: Java JAR Dosyasının Oluşturulması ve Yürütülmesi
- Java İstisnaları ve Örneklerle İstisna İşlemleri
- Yeni Başlayanlar İçin JAVA Eğitimi: 100+ Uygulamalı Java Video Eğitimi
- Örneklerle Java Yansıtma Eğitimi
- Java 'bu' Anahtar Kelime: Kod Örnekleriyle Eğitim