Tutorial Generik Java - Apa sing Umum lan Cara Nggunakake?

Java Generics minangka salah sawijining fitur sing paling penting kanggo basa Jawa. Gagasan ing generik umum banget, nanging kadang dadi kompleks amarga owah-owahan saka sintaksis sing ana gandhengane.

Tujuan tutorial iki yaiku kanggo ngenalake sampeyan konsep umum sing migunani kanthi cara sing gampang dingerteni.

Nanging sadurunge nyelehake generik dhewe, ayo ngerteni kenapa generik Jawa dibutuhake luwih dhisik.




Tujuan Generasi Jawa

Sadurunge nggawe generik ing Java 5, sampeyan bisa nulis lan nyusun potongan kode kaya iki tanpa menehi kesalahan utawa peringatan:

List list = new ArrayList(); list.add('hey'); list.add(new Object());

Sampeyan bisa nambah angka apa wae ing dhaptar utawa Koleksi Java liyane tanpa kudu ngumumake jinis data sing disimpen. Nanging yen sampeyan njupuk angka saka dhaptar, sampeyan kudu kanthi eksplisit ngirim menyang jinis tartamtu.


Coba iterasi liwat dhaptar ing ndhuwur.



for (int i=0; i< list.size(); i++) {
String value = (String) list.get(i); //CastClassException when i=1 }

Ngidini nggawe dhaptar tanpa ngumumake jinis data sing disimpen, kaya sing wis ditindakake, bisa nyebabake programer nggawe kesalahan kaya ing ndhuwur sing mbuwang ClassCastExceptions sajrone runtime.

Generik dikenalake kanggo nyegah programer nggawe kesalahan kasebut.

Kanthi umum, sampeyan kanthi eksplisit bisa ngumumake jinis data sing bakal disimpen nalika nggawe Kumpulan Java kaya conto ing ngisor iki.


Cathetan:Sampeyan isih bisa nggawe obyek koleksi Java tanpa nemtokake jinis data sing disimpen nanging ora disaranake. List stringList = new ArrayList();

Saiki, sampeyan ora bisa salah nyimpen Integer ing dhaptar jinis String tanpa mbuwang kesalahan kompilasi. Iki njamin manawa program sampeyan ora ngalami kesalahan runtime.

stringList.add(new Integer(4)); //Compile time Error

Tujuan utama nggawe generik menyang Jawa yaiku supaya ora kesusu ClassCastExceptions sajrone runtime.



Nggawe Generik Jawa

Sampeyan bisa nggunakake umum kanggo nggawe kelas lan metode Java. Ayo goleki conto babagan cara nggawe generik saben jinis.

Kelas Generik

Nalika nggawe kelas umum, paramèter jinis kanggo kelas ditambahake ing pungkasan jeneng kelas ing sangisore sudut krenjang


public class GenericClass {
private T item;
public void setItem(T item) {
this.item = item;
}
public T getItem() {
return this.item;
} }

Ing kene, T yaiku parameter jinis data. T, N, lan E yaiku sawetara huruf sing digunakake kanggo paramèter jinis data miturut konvensi Java.

Ing conto ing ndhuwur, sampeyan bisa menehi jinis data tartamtu nalika nggawe obyek GenericClass.

public static void main(String[] args) {
GenericClass gc1 = new GenericClass();
gc1.setItem('hello');
String item1 = gc1.getItem(); // 'hello'
gc1.setItem(new Object()); //Error
GenericClass gc2 = new GenericClass();
gc2.setItem(new Integer(1));
Integer item2 = gc2.getItem(); // 1
gc2.setItem('hello'); //Error }

Sampeyan ora bisa ngliwati jinis data primitif menyang parameter jinis data nalika nggawe obyek kelas umum. Mung jinis data sing ngluwihi jinis Obyek sing bisa diliwati minangka paramèter jinis.

Contone:


GenericClass gc3 = new GenericClass(); //Error

Metode Generik

Nggawe cara umum ngetutake pola sing padha karo nggawe kelas umum. Sampeyan bisa ngetrapake cara umum ing kelas umum lan uga non-umum.

public class GenericMethodClass {
public static void printItems(T[] arr){
for (int i=0; i< arr.length; i++) {

System.out.println(arr[i]);
}
}
public static void main(String[] args) {
String[] arr1 = {'Cat', 'Dog', 'Mouse'};
Integer[] arr2 = {1, 2, 3};

GenericMethodClass.printItems(arr1); // 'Cat', 'Dog', 'Mouse'
GenericMethodClass.printItems(arr2); // 1, 2, 3
} }

Ing kene, sampeyan bisa ngliwati macem-macem jinis tartamtu kanggo ngeterake metodhe. Cara umum PrintItems() iterasi liwat larik sing wis dilewatake lan nyithak item sing disimpen kaya metode Java normal.



Parameter Tipe Terikat

Nganti saiki, kelas lan metode umum sing digawe ing ndhuwur bisa di paramèter karo jinis data apa wae kajaba jinis primitif. Nanging kepiye yen kita pengin matesi jinis data sing bisa ditularake menyang umum? Iki kalebu parameter jinis sing diwatesi.

Sampeyan bisa ngencengi jinis data sing ditampa karo kelas utawa metode umum kanthi nemtokake manawa kudu dadi subkelas jinis data liyane.


Contone:

//accepts only subclasses of List public class UpperBoundedClass{
//accepts only subclasses of List
public void UpperBoundedMethod(T[] arr) {
} }

Ing kene, ing UpperBoundedClass lan UpperBoundedMethod mung bisa di paramèterisasi nganggo subtipe List jinis data.

List jinis data tumindak minangka wates ndhuwur kanggo parameter jinis. Yen sampeyan nyoba nggunakake jinis data sing dudu jinis subtipe List, kesalahan kasebut bakal nyebabake kesalahan kompilasi.

Watese ora diwatesi mung kanggo kelas. Sampeyan uga bisa ngliwati antarmuka. Ngembangake antarmuka tegese, ing kasus iki, ngetrapake antarmuka.

Parameter uga bisa duwe sawetara wates kaya conto iki.

//accepts only subclasses of both Mammal and Animal public class MultipleBoundedClass{
//accepts only subclasses of both Mammal and Animal
public void MultipleBoundedMethod(T[] arr){
} }

Jinis data sing nampa kudu dadi subkelas kaloro kelas Kewan lan Mamalia. Yen salah sawijining wates kasebut minangka kelas, mesthine kudu luwih dhisik ing deklarasi kasebut.

Ing conto ing ndhuwur, yen Mammal minangka kelas lan Kewan minangka antarmuka, Mamalia kudu luwih dhisik kaya sing dituduhake ing ndhuwur. Yen ora, kode kasebut bakal nyebabake kesalahan kompilasi.



Wildcards Generik Jawa

Wildcards digunakake kanggo menehi paramèter jinis umum menyang cara. Ora kaya cara umum, ing kene, paramèter generik ditransfer menyang paramèter sing ditampa metode kasebut, sing béda karo paramèter jinis data sing dibahas ing ndhuwur. Wildcard diwakili dening? simbol.

public void printItems(List list) {
for (int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
} }

Ing ndhuwur printItems() cara nampa dhaptar jinis data minangka parameter. Iki ngalangi programer supaya ora mbaleni kode kanggo dhaptar macem-macem jinis data, sing bakal kedadeyan tanpa umum.

Wildcards Ndhuwur Ndhuwur

Yen pengin matesi jinis data sing disimpen ing dhaptar sing ditampa kanthi cara kasebut, kita bisa nggunakake kertu liar sing diwatesi.

Tuladha:

public void printSubTypes(List list) {
for (int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
} }

printSubTypes() cara mung nampa dhaptar sing nyimpen subtipe Warna. Nampa dhaptar obyek RedColor utawa BlueColor, nanging ora nampa dhaptar obyek Kewan. Iki amarga Kewan dudu jinis subtipe Warna. Iki minangka conto kertu liar sing diwatesi ndhuwur.

Wildcards Bound ngisor

Kajaba, yen kita duwe:

public void printSuperTypes(List list) {
for (int i=0; i< list.size(); i++) {
System.out.println(list.get(i));
} }

banjur, ing printSuperTypes() cara mung nampa dhaptar sing nyimpen jinis super saka kelas Asu. Iki bakal nampa dhaptar obyek Mamalia utawa Kewan nanging dudu dhaptar obyek LabDog amarga LabDog dudu superclass of Dog, nanging subclass. Iki minangka conto kertu liar sing diwatesi ngisor.



Kesimpulan

Java Generics wis dadi fitur sing ora bisa ditindakake programer wiwit ora dikenalake.

Popularitas iki amarga pengaruhe nggawe urip programmer dadi luwih gampang. Saliyane ngalangi supaya ora nggawe kesalahan kode, panggunaan umum nggawe kode kasebut ora bola-bali. Apa sampeyan ngelingi cara umumake kelas lan cara supaya ora mbaleni kode kanggo macem-macem jinis data?

Ngerti babagan umum umum penting kanggo dadi ahli ing basa kasebut. Dadi, ngetrapake apa sing sampeyan sinaoni ing tutorial iki ing kode praktis minangka cara kanggo maju saiki.