Mis on Java geneerika?

Java geneerikat tutvustati juba 2004. aastal Java programmeerimiskeele uue funktsioonina ja see oli osa JDK 5 väljalaskest. Seda kasutatakse kõige laialdasemalt koos Java-kogude raamistikuga. Tänaseks on see Java-programmeerimiskeele üks silmapaistvamaid ja ihaldatumaid omadusi.

Üldise Java leidis neli isikut, nimelt Gilad Bracha, Martin Odersky, David Stoutamire ja Philip Wadler 1998. aastal. See oli Java keele laiendus, mis toetas geneerilisi tüüpe. Selle eesmärk oli saavutada kaks peamist eesmärki, mis on:

  1. Tüübi ohutus
  2. Koodi korduvkasutatavus

Mõiste geneeriliste Java

Geneerikat saab määratleda kui koodi korduvkasutatavuse saavutamise viisi, määratledes üldklassid, liidesed, konstruktorid ja meetodid, mida saab kasutada erinevate andmetüüpidega ning millega saavutatakse ka tüübi ohutus, kuulutades juurutamisel kasutatava andmetüübi enne kasutamist, välistades seega käitusaja vea tõenäosus.

Kuidas Java-s geneerilisi ravimeid rakendatakse?

Geneerikute rakendamisel kasutatakse nurksulgu ““. Sulgudes on nendes tüübiparameeter “T”. Näide. Tüüpparameeter “T” on kohahoidja, mis näitab, et andmetüüp omistatakse sellele jooksval ajal. Näiteks määratletakse üldklass järgmiselt:

public class MyGenericClass (…)

Järgnevad on standardset tüüpi parameetrid:

  • T: tüüp
  • E: element
  • N: arv
  • K: võti
  • V: väärtus

S, U, V ja nii edasi kasutatakse vastavalt teise, kolmanda ja neljanda parameetri määratlemiseks juhul, kui kasutatakse mitme parameetriga parameetreid.

Geneerika mõistmine Java keeles

Nüüdseks võiksite küsida, mis on tüübi ohutus ja kuidas see töötab? Või kuidas erinevad üldklassid, liidesed, konstruktorid ja meetodid meie tavalistest klassidest ja meetoditest, mis muudavad need korduvkasutatavaks? Uurime välja.

Kuna Java on staatiliselt trükitud keel, peate enne muutuja kasutamist kinnitama selle tüübi, mis on muutuja valduses oleva väärtuse andmetüüp.

Näide: String myString =”eduCBA”;

Siin on “String” andmetüüp, “myString” on muutuja, mis hoiab väärtust, mille tüüp on String.

Kui proovite näiteks stringi asemel edastada tõeväärtust:

String myBooleanStr = true;

Saate kohe kompileerimisaja vea, milles öeldakse: "Type neatmatch: ei saa teisendada tõeväärtusest Stringiks".

Kuidas saavutada geneerikute abil koodide korduvkasutatavus?

Määratlegem nüüd tavaline meetod:

public static void welcome(String name)(
System.out.println("welcome to " + name);
)

Sellele meetodile saab tugineda ainult stringi parameetri möödumisel. Näiteks:

welcome(“eduCBA”);

Selle väljund on “teretulnud eduCBAsse”.

Kuid te ei saa seda meetodit kasutada, väljudes muudest andmetüüpidest, näiteks täisarv või tõeväärtus. Kui proovite seda teha, palutakse teil koostamisaja veaga öelda, et tüüpi Runner meetodi tervitus (string) pole argumentide jaoks rakendatav (tõeväärtus). See tähendab, et te ei saa edastada ühtegi muud andmetüüpi meetodile, mis võtab parameetrina vastu ainult stringi.

See tähendab ka seda, kui soovite kutsuda sarnast meetodit erinevat tüüpi andmetüübi jaoks, peate kirjutama uue meetodi, mis aktsepteerib parameetrina nõutavat andmetüüpi. Seda erinevat tüüpi andmeside parameetritega ümberkirjutamismeetodit nimetatakse ka meetodi ülekoormamiseks. Selle suur puudus on see, et see suurendab teie koodi mahtu.

Kuid me võiksime ka Genericsi abil ülaltoodud meetodit ümber kirjutada ja kasutada seda mis tahes andmetüübi jaoks, mida vajame.

Üldise meetodi määratlemine:

public static void welcome(T t)(
System.out.println("it is " + t);
)

Märkus : siin on t-tüüpi objekt T. T-le omistatakse andmetüüp, mida kasutatakse meetodi käivitamiseks.

Nüüd saate seda meetodit uuesti kasutada, kutsudes selle vajaduse korral stringi, loogika või täisarvu või muu andmetüübi jaoks.

welcome("educate");
Integer Myint = 1;
welcome(Myint)
welcome(true);

Ülaltoodud avaldused annavad järgmise väljundi:

See on Educa
See on 1
See on tõsi

Seetõttu saame siin geneerilisi ravimeid kasutades oma meetodit erinevate andmetüüpide jaoks uuesti kasutada.

Kuidas Genericsi abil tüübi ohutust saavutada?

Üks peamisi erinevusi massiivide ja kogumise vahel on see, et massiivid saavad salvestada ainult homogeenseid andmeid, samas kui kogud võivad salvestada heterogeenseid andmeid. See tähendab, et kogud võivad salvestada mis tahes kasutaja määratletud andmetüüpi / objekte.

MÄRKUS. Kogud võivad hoida ainult objekte (kasutaja määratletud andmetüüp), mitte primitiivseid andmetüüpe. Primitiivsete andmetega töötamiseks kasutavad tüübikogud ümbriste klasse.

Vaatleme nüüd ArrayList.

ArrayList myList = new ArrayList();

Lisageme objektile ArrayList andmeid stringi, täisarvu ja topelt tüübi kohta.

myList.add("eduCBA");
myList.add(1);
myList.add(5.2);

Objekti ArrayList printimisel näeme, et sellel on järgmised väärtused: (eduCBA, 1, 5.2).

Nüüd, kui soovite need väärtused muutujateks hankida, peate need kirjutama.

String someStr = (String)myList.get(0);
Integer someInt = (Integer)myList.get(1);
Double someFlt = (Double)myList.get(2);

Kui te ei kirjuta spetsiifikat, palutakse teil koostamisaja veaga öelda: „Tüübi sobimatus: ei saa teisendada objektist stringi”.

Siit saate järeldada, et objektide oma ArrayListist allalaadimisel peate need tüübi järgi määrama. Siinkohal kerkib küsimus, kuidas saate teada, millist andmetüüpi selle määramiseks soovite? Reaalajas sisaldab teie ArrayList tuhandeid kirjeid ja selle kirjutamine erinevatele andmetüüpidele iga üksiku objekti jaoks pole valik. Võib juhtuda, et kirjutate selle valele andmetüübile. Mis siis juhtub?

Seekord ei kuvata kompileerimisaja viga, vaid viskate käitusvea, märkides „Erandi lõimes“ peamine ”java.lang.ClassCastException: java.lang.Integerit ei saa java.lang.Stringile üle anda saidil com.serviceClasess.Runner. .main (Jooksja.java:43) ”.

Kuna me ei saa tagada kollektsioonis sisalduvate andmete tüüpi (antud juhul ArrayList), peetakse neid tüübi suhtes ohutuks kasutamiseks. See on koht, kus geneerilised ravimid tulevad mängu tüübi ohutuse tagamiseks.

ArrayListi kasutamine koos geneerikutega:

ArrayList myList = new ArrayList();

Pange tähele, et nurksulgude “” sees on määratud stringi tüüp, mis tähendab, et see konkreetne ArrayListi rakendus saab hoida ainult stringi tüüpi andmeid. Kui proovite sellele lisada mõnda muud andmetüüpi, viskab see lihtsalt ajavea kokku. Siin olete muutnud oma ArrayListi tüübi turvaliseks, välistades võimaluse lisada mõni muu andmetüüp peale “String”.

Nüüd, kui olete määranud andmetüübi, mida on lubatud geneeriliste ravimite abil oma kogusse lisada, ei pea te andmete hankimisel enam seda kirjutama. See tähendab, et saate oma andmed lihtsalt hankida, kirjutades:

String someStr = myList.get(0);

Kuidas teeb Java Generics töötamise nii lihtsaks?

See aitab muuta teie kogud tüübikindlaks, veendudes sellega, et teie kood ei tööta hilisema aja tõttu tööaja erandi tõttu. See säästab ka seda, et kodeerija ei pea iga kollektsiooni objekti kirjutama, muutes koodi väljatöötamise kiiremaks ja lihtsamaks. Kasutades üldklasse ja -meetodeid, saab koodi taaskasutada ka rakendamisel vajalike andmetüüpide järgi.

Mida saab Java Genericas veel teha?

Siiani oleme näinud, kuidas saame geneeriliste ravimite abil saavutada tüübi ohutust ja koodi korduvkasutatavust. Vaadakem nüüd muid funktsioone, mida geneerikud pakuvad. Nemad on:

  1. Piiratud ja mitut piiritletud tüüpi
  2. Tippige metamärke

Piiratud tüüp: piiritletud tüübi korral on parameetri andmetüüp piiratud kindla vahemikuga. See saavutatakse märksõna „laiendab“ abil.

Vaatleme näiteks üldklassi, millel on piiratud tüüpi parameeter, mis laiendab käitatavat liidest:

class myGenericClass()

Luues oma objekti teises klassis:

myGenericClass myGen = new myGenericClass();

Ülaltoodud avaldus töötab suurepäraselt ja ilma vigadeta. See tähendab, et piiritletud tüübi korral võite läbida sama klassitüübi või selle alamklassi tüübi. Samuti saate parameetri tüübi liidesega siduda ja selle käivitamisel selle rakendusi edasi anda, nagu meie ülaltoodud näite puhul.

Mis juhtub, kui proovite kasutada muud tüüpi parameetreid?

myGenericClass myGen = new myGenericClass();

Ülaltoodud juhul saate kompileerimise aja vea, mis ütleb: “Seotud ebakõla: Tüüp täisarv ei asenda tüübi myGenericClass tüübihinnangu kehtivat asendajat”.

Mitu piiratut tüüpi: mitme piiritletud tüübi korral saame siduda parameetri andmetüübi rohkem kui ühe tüübiga. Näiteks,

Class myGeneric()

Sel juhul saate mööduda mis tahes tüübist, mis laiendab numbriklassi ja rakendab käivitatavat liidest. Mitme piiritletud tüübi kasutamisel tuleks siiski arvestada mõne asjaga:

  1. Me ei saa korraga laiendada rohkem kui ühte klassi.
  2. Saame laiendada suvalist arvu liideseid korraga, kuid liidestele pole piirangut.
  3. Klassi nimele peaks alati järgnema liidese nimi, vastasel juhul toob see kaasa kompileerimise aja vea.

Tüüpi metamärgid: neid tähistab täht “?” - küsimärgi sümbol. Selles kasutatakse kahte peamist märksõna:

laieneb (ülemise piiri määratlemiseks) ja super (alumiste piiride määratlemiseks).

Näiteks,

ArrayList al

See ArrayListi objekt “al” sisaldab kõiki T-tüüpi andmeid ja kõiki selle alamklasse.

ArrayList al

See ArrayListi objekt “al” hoiab kõiki T-tüüpi andmeid ja kõiki selle superklasse.

Genericsi eelised Java-s

1. Paindlikkus : Generics pakub meie koodile paindlikkust erinevate andmetüüpide kohandamiseks geneeriliste klasside ja meetodite abil.

2. Koodi hooldus ja korduvkasutatavus : üldiste klasside ja meetodite tõttu ei pea koodi ümber kirjutama, kui hilisemas etapis muutuvad nõuded, mis muudavad koodi hooldamise ja taaskasutamise lihtsamaks.

3. Tüübiohutus: pakub kogumisraamistikule tüübiohutust, määratledes eelnevalt andmetüübi, mida kogu võib hoida, ja välistades ClassCastExceptioni tõttu tõrkevõimalused töö ajal.

4. Kirjutamisvajaduse välistamine: kuna kogude valduses olevad andmetüübid on juba kindlaks määratud, ei pea selle otsimise ajal trükivälja andma. See vähendab koodi pikkust ja vähendab ka kooderi pingutusi.

Java oskuste geneetika

Genericsiga töötamiseks peaksite olema hästi kursis Java põhitõdedega. Peaksite mõistma, kuidas tüübi kontrollimine ja tüüpi casting toimivad. Vaja on põhjalikke teadmisi muudest mõistetest, näiteks meetodi ülekoormamine, vanemate ja laste klasside suhted, liidesed ja nende rakendamine. Kogumisraamistikuga töötamisel on ülioluline mõista ka primitiivsete andmetüüpide (süsteemi määratletud andmetüüp) ja objektide (kasutaja määratletud andmetüüp) erinevust.

Miks peaksime Java kasutama Genericat?

Geneeriliste ravimite kasutamine muudab meie koodi hooldatavamaks, kuna see vähendab vajadust andmespetsiifilise koodi ümberkirjutamiseks iga kord, kui nõue muutub. Piiratud tüüpi geneeriliste ravimite kasutamisel võiksite andmetüüpi piirata ja samal ajal oma koodi paindlikkust pakkuda, määratledes selle ulatuse. Teie kood hiljem tõenäoliselt ebaõnnestub, kuna see pakub tüübi turvalisust, muutes teie koodi vähem veatuks.

Java geneeriliste ravimite rakendusala

Geneeriliste ravimite ulatus on piiratud aja koostamisega. See tähendab, et geneeriliste ravimite kontseptsioon on kohaldatav ainult koostamise ajal, kuid mitte käitamisajal. Näiteks,

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

Siin on kõik neli ülaltoodud väidet üks ja sama. Need võimaldavad loendiobjektile lisada mis tahes tüüpi andmeid.

Järeldus

Geneerilised tooted muudavad kodeerimise kodeerija jaoks lihtsaks. Tugeva tüübikontrolli abil vähendab see tõenäosust, et töö ajal tekib ClassCastException. Kõrvaldab täielikult tüübivalamise vajaduse, mis tähendab, et vähem tuleb kirjutada koodi. See annab meile võimaluse töötada välja geneerilisi algoritme, mis ei sõltu andmetüübist, millega nad töötavad.

Soovitatavad artiklid

See on olnud teemaks Mis on Generics Java ?. Siin arutasime Java geneerikute oskusi, ulatust, töötamist, mõistmist ja eeliseid. Lisateavet leiate ka meie muudest soovitatud artiklitest -

  1. Mis on tavaline lüüsiliides
  2. Java 8 installimine
  3. mis on seepUI
  4. Mis on JavaScript?
  5. Java Booleans

Kategooria: