Java Generics kennsla - Hvað eru samheitalyf og hvernig á að nota þau?

Java Generics er einn mikilvægasti eiginleiki Java tungumálsins. Hugmyndin að baki samheitalyfjum er frekar einföld, þó kemur það stundum flókið út af breytingunni frá venjulegum setningafræði sem tengist henni.

Tilgangur þessarar kennslu er að kynna þér þetta gagnlega hugtak samheitalyfja á auðskiljanlegan hátt.

En áður en kafað er í samheitalyfin sjálf skulum við átta okkur á því hvers vegna Java samheitalyf var nauðsynleg í fyrsta lagi.




Tilgangur Java Generics

Fyrir kynningu á samheitalyfjum í Java 5 gætirðu skrifað og sett saman svona kóðabút án þess að kasta villu eða viðvörun:

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

Þú gætir bætt gildi af hvaða gerð sem er við lista eða annað Java safn án þess að þurfa að lýsa því yfir hvaða tegund gagna það geymir. En þegar þú sækir gildi af listanum þarftu að varpa því sérstaklega fram í ákveðna tegund.


Íhugaðu að fara í gegnum ofangreindan lista.



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

Að leyfa stofnun lista án þess að lýsa fyrst yfir geymdu gagnategundinni, eins og við gerðum, gæti leitt til þess að forritarar gera mistök eins og hér að ofan sem kastar ClassCastExceptions á keyrslutíma.

Generics voru kynnt til að koma í veg fyrir að forritarar gerðu slík mistök.

Með samheitalyfjum er hægt að lýsa skýrt yfir gagnagerðinni sem á að geyma þegar búið er til Java safn eins og eftirfarandi dæmi sýnir.


Athugið:Þú getur samt búið til Java safnhlut án þess að tilgreina geymda gagnategundina en það er ekki mælt með því. List stringList = new ArrayList();

Nú geturðu ekki geymt heiltölu í strengjalistanum fyrir mistök án þess að kasta samantektarvillu. Þetta tryggir að forritið lendi ekki í villum í keyrslu.

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

Megintilgangur kynningar samheitalyfja á Java var að forðast að lenda í ClassCastExceptions á keyrslutíma.



Búa til Java Generics

Þú getur notað samheitalyf til að búa til Java námskeið og aðferðir. Við skulum skoða dæmi um hvernig á að búa til samheitalyf af hverri gerð.

Generic Class

Þegar almennur flokkur er búinn er tegundarfæribreytunni fyrir bekkinn bætt við í lok bekkjarnafnsins innan horns sviga.


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

Hér, T er breytu gagnagerðarinnar. T, N, og E eru nokkrir stafirnir sem notaðir eru við breytur gagnagerðar samkvæmt Java-reglum.

Í dæminu hér að ofan er hægt að láta það tiltekna gagnategund þegar búið er til GenericClass hlut.

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 }

Þú getur ekki framselt frumstæða gagnategund til breytu gagnagerðarinnar þegar þú býrð til almennan bekkjahlut. Aðeins gagnategundir sem lengja gerð hlutar geta verið sendar sem gerðarbreytur.

Til dæmis:


GenericClass gc3 = new GenericClass(); //Error

Almennar aðferðir

Að búa til almennar aðferðir fylgir svipuðu mynstri og að búa til almenna flokka. Þú getur innleitt almenna aðferð inni í almennum bekk sem og ekki almennri.

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
} }

Hér getur þú framhjá fylki af tiltekinni gerð til að breyta aðferðinni. Generic aðferðin PrintItems() það gengur í gegnum framhjá fylkið og prentar hlutina sem eru geymdir alveg eins og venjuleg Java aðferð.



Takmarkaðar gerðarfæribreytur

Hingað til er hægt að breyta almennum flokkum og aðferðum sem við bjuggum til hér að framan við hvaða gagnategund sem er en frumstæðar gerðir. En hvað ef við vildum takmarka gagnategundirnar sem hægt er að miðla til samheitalyfja? Þetta er þar sem takmarkaðar gerðarfæribreytur koma inn.

Þú getur bundið þær gagnategundir sem samþykktar eru af almennum flokki eða aðferð með því að tilgreina að það eigi að vera undirflokkur af annarri gagnategund.


Til dæmis:

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

Hér, UpperBoundedClass og UpperBoundedMethod Aðeins er hægt að færibreyta með undirtegundum List gagnagerð.

List gagnagerð virkar sem efri mörk við gerðarfæribreytuna. Ef þú reynir að nota gagnategund sem er ekki undirgerð List, mun það henda villu í samantektartíma.

Mörkin eru ekki takmörkuð við aðeins bekki. Þú getur framhjá tengi eins og heilbrigður. Að lengja viðmótið þýðir, í þessu tilfelli, að innleiða viðmótið.

Færibreyta getur einnig haft mörg mörk eins og þetta dæmi sýnir.

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

Gagnagerðin sem samþykkir verður að vera undirflokkur bæði dýra- og spendýraflokka. Ef eitt af þessum mörkum er flokkur verður það að koma fyrst í bundnu yfirlýsingunni.

Í dæminu hér að ofan, ef spendýr er flokkur og dýr er viðmót, verður spendýr að koma fyrst eins og sýnt er hér að ofan. Annars varpar kóðinn saman villutímanum.



Java Generics jókort

Jókort er notað til að miðla breytum af almennum gerðum til aðferða. Ólíkt, almenn aðferð, hér er almenna breytan send til breytanna sem aðferðin samþykkir, sem er frábrugðin gagnagerðarbreytunni sem við ræddum hér að ofan. A wildcard er táknuð með? tákn.

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

Ofangreint printItems() aðferð tekur við lista yfir hvaða gagnategund sem breytu. Þetta kemur í veg fyrir að forritarar þurfi að endurtaka kóða fyrir lista yfir mismunandi gagnategundir, sem væri raunin án samheitalyfja.

Wildcards efri mörk

Ef við viljum takmarka þær gagnategundir sem eru geymdar á listanum sem aðferðin samþykkir, getum við notað jaðar kort.

Dæmi:

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

printSubTypes() aðferð samþykkir aðeins listana sem geyma undirgerðir af lit. Það tekur við lista yfir RedColor eða BlueColor hluti, en tekur ekki við lista yfir dýrahluti. Þetta er vegna þess að dýrið er ekki undirtegund af lit. Þetta er dæmi um jókort með efri mörkum.

Wildcards með lægri mörk

Á sama hátt, ef við hefðum:

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

þá, printSuperTypes() aðferð tekur aðeins við lista sem geyma ofurgerðir af flokki hunda. Það myndi samþykkja lista yfir spendýra- eða dýrahluti en ekki lista yfir LabDog-hluti því LabDog er ekki ofurflokkur hunda, heldur undirflokkur. Þetta er dæmi um jókertafla með lægri mörkum.



Niðurstaða

Java Generics er orðinn eiginleiki sem forritarar geta ekki lifað án frá því hann var kynntur.

Þessar vinsældir eru vegna áhrifa þeirra á að gera líf forritara auðveldara. Annað en að koma í veg fyrir að þeir geri kóðamistök, gerir notkun samheitalyfja kóðann minni. Tókstu eftir því hvernig það alhæfir námskeið og aðferðir til að forðast að þurfa að endurtaka kóða fyrir mismunandi gagnategundir?

Að hafa góð tök á samheitalyfjum er mikilvægt til að verða sérfræðingur í tungumálinu. Svo að beita því sem þú lærðir í þessari kennslu í verklegum kóða er leiðin til að halda áfram núna.