Mikä on Generic Java?

Java-geneeriset tuotteet otettiin käyttöön jo vuonna 2004 uutena Java-ohjelmointikielen ominaisuutena ja olivat osa JDK 5 -julkaisua. Sitä käytetään laajimmin Java-kokoelmien yhteydessä. Nykyään se on yksi Java-ohjelmointikielen näkyvin ja halutuin ominaisuus.

Generic Java löytyi neljästä henkilöstä, nimittäin Gilad Bracha, Martin Odersky, David Stoutamire ja Philip Wadler vuonna 1998. Se oli Java-kielen jatko, joka tuki geneerisiä tyyppejä. Sen oli tarkoitus saavuttaa kaksi päätavoitetta, jotka ovat:

  1. Tyyppi turvallisuus
  2. Koodin uudelleenkäytettävyys

Määritelmä Generics Java

Geneerisiä tekniikoita voidaan määritellä tapana saavuttaa koodin uudelleenkäytettävyys määrittelemällä geneeriset luokat, rajapinnat, rakentajat ja menetelmät, joita voidaan käyttää erilaisilla tietotyypeillä ja joilla saavutetaan myös tyyppiturvallisuus ilmoittamalla toteutuksessa käytettävä tietotyyppi etukäteen, jolloin eliminoidaan ajonaikaisen virheen mahdollisuus.

Kuinka geneeriset tuotteet otetaan käyttöön Java-ohjelmassa?

Geneeriset tuotteet toteutetaan kulmakiinnikkeillä “”. Suluissa on tyyppiparametri “T”. Esimerkki:. Tyyppiparametri “T” on paikan haltija, joka osoittaa, että tietotyyppi osoitetaan sille ajon aikana. Esimerkiksi yleinen luokka määritellään seuraavasti:

public class MyGenericClass (…)

Seuraavat ovat vakiotyyppisiä parametreja:

  • T: Tyyppi
  • E: Elementti
  • N: Numero
  • K: Avain
  • V: Arvo

S, U, V ja niin edelleen käytetään määrittelemään vastaavasti toinen, kolmas ja neljäs parametri, jos käytetään moniparametria.

Genericin ymmärtäminen Java-ohjelmassa

Tähän mennessä saatat ihmetellä, mikä on tyyppiturvallisuus ja miten se toimii? Tai miten geneeriset luokat, rajapinnat, rakentajat ja menetelmät eroavat tavallisista luokistamme ja menetelmistä, jotka tekevät niistä uudelleenkäytettäviä? Otetaan selvää.

Java on staattisesti kirjoitettu kieli edellyttää, että sinun on ilmoitettava "tyyppi", joka on muuttujan hallussa olevan arvon tietotyyppi, ennen kuin sitä käytetään.

Esimerkki: String myString =”eduCBA”;

Tässä ”String” on tietotyyppi, “myString” on muuttuja, jolla on arvo, jonka tyyppi on String.

Jos nyt yrität välittää Boolean-arvoa merkkijonon sijasta, esimerkiksi:

String myBooleanStr = true;

Saat heti käännösajan virheen, jonka sanoma on "Type mismatch: ei voi muuntaa boolen arvosta Stringiksi".

Kuinka saavutamme koodin uudelleenkäytettävyyden Genericsin avulla?

Määritetään nyt tavallinen menetelmä:

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

Tätä menetelmää voidaan käyttää vain ohittamalla merkkijonoparametri. Esimerkiksi:

welcome(“eduCBA”);

Sen lähtö on ”tervetullut eduCBA: lle”.

Et voi kuitenkaan vedota tähän menetelmään ohittamalla muita tietotyyppejä, kuten kokonaislukua tai loogista. Jos yrität tehdä niin, sinulta kysytään käännösajan virheilmoituksella, jonka mukaan ”Runner-tyyppinen menetelmän tervetullut (merkkijono) ei sovellu argumentteihin (boolen)”. Tarkoittaa, että et voi siirtää mitään muuta tietotyyppiä menetelmälle, joka hyväksyy vain merkkijonon parametrina.

Tämä tarkoittaa myös, että jos haluat vedota samanlaiseen menetelmään eri tietotyypille, sinun on kirjoitettava uusi menetelmä, joka hyväksyy vaaditun tietotyypin parametrina. Tätä menetelmää, joka koskee eri tietotyyppien parametrien uudelleenkirjoitusta, tunnetaan myös menetelmän ylikuormituksena. Suurin haittapuoli tässä on se, että se suurentaa koodisi kokoa.

Voimme kuitenkin käyttää Generics-ohjelmaa myös edellä mainitun menetelmän kirjoittamiseen uudelleen ja käyttää sitä mihin tahansa tarvitsemmemme tietotyypiin.

Yleisen menetelmän määritteleminen:

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

Huomaa : Tässä “t” on tyypin T. esine. T: lle osoitetaan tietotyyppi, jota käytetään menetelmän käynnistämiseen.

Nyt voit käyttää tätä menetelmää uudelleen kutsumalla sitä merkkijonoon tarvittaessa tai boolen tai kokonaisluvun tai muun tietotyypin.

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

Yllä olevat lausunnot tarjoavat seuraavan tuloksen:

Se on Educa
Se on 1
Se on totta

Siksi käyttämällä geneerisiä lääkkeitä tässä, pystymme käyttämään menetelmäämme uudelleen erilaisille tietotyypeille.

Kuinka saavutamme tyyppiturvan Genericillä?

Yksi suurimmista eroista ryhmien ja keräyksen välillä on, että taulukot voivat tallentaa vain homogeenista dataa, kun taas kokoelmat voivat tallentaa heterogeenistä tietoa. Eli kokoelmat voivat tallentaa minkä tahansa käyttäjän määrittelemän tietotyypin / objektit.

HUOMAUTUS: Kokoelmissa voi olla vain objekteja (käyttäjän määrittelemä tietotyyppi) eikä primitiivisiä tietotyyppejä. Toimiakseen primitiivisen datan kanssa tyyppikokoelmat käyttävät kääreluokkia.

Katsotaanpa nyt ArrayList.

ArrayList myList = new ArrayList();

Lisäämme ArrayList-objektiin tyypin String, Integer ja Double tietoja.

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

Tulostaessasi ArrayList-objektia voimme nähdä, että sillä on seuraavat arvot: (eduCBA, 1, 5.2).

Nyt jos haluat hakea nämä arvot muuttujiksi, joudut sitten määrittelemään ne.

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

Jos et kirjoita kirjoituskirjettä, sinulta kysytään käännösaikavirhettä, jonka sanoma on "Type neatmat: ei voi muuntaa objektista merkkijonoksi".

Tästä voit päätellä, että noudettaessa objekteja ArrayListista sinun on määritettävä se niiden tyyppeihin. Tässä nouseva kysymys on, miten tiedät, minkä tyyppiseen tietotyyppiin se kirjoitetaan? Reaaliajassa ArrayList sisältää tuhansia tietueita, ja sen määrittäminen eri tietotyypeille jokaiselle kohteelle ei ole vaihtoehto. Saatat johtaa siihen, että kirjoitit sen väärään tietotyyppiin. Mitä sitten tapahtuu?

Tällä kertaa et saa käännösaikavirhettä, mutta heittää ajonaikaisen virheen sanomalla ”Poikkeus säieessä” pää ”java.lang.ClassCastException: java.lang.Integeriä ei voi lähettää java.lang.Stringiin osoitteessa com.serviceClasess.Runner Pääasiallinen (Runner.java:43)”.

Koska emme voi taata kokoelmassa olevien tietojen tyyppiä (tässä tapauksessa ArrayList), niiden ei katsota olevan turvallisia tyypin suhteen. Tällöin geneeriset tuotteet tulevat tarjoamaan tyyppiturvallisuutta.

ArrayListin käyttäminen Genericsin kanssa:

ArrayList myList = new ArrayList();

Huomaa, että kulmasulkeiden sisällä ””, merkkijonon tyyppi on määritelty, mikä tarkoittaa, että tämä tietty ArrayList-sovelluksen sovellus voi pitää vain merkkijonotyyppitietoja. Jos yrität lisätä siihen jotain muuta tietotyyppiä, se vain kääntää aikavirheen. Täällä olet tehnyt ArrayList-tyyppisi turvallista poistamalla sen mahdollisuuden lisätä muuta tietotyyppiä kuin “String”.

Nyt kun olet määrittänyt tietotyypin, jonka sallitaan lisätä kokoelmaan geneeristen lääkkeiden avulla, sinun ei enää tarvitse kirjoittaa sitä tietotietoja haettaessa. Eli voit hakea tietosi yksinkertaisesti kirjoittamalla:

String someStr = myList.get(0);

Kuinka Java-sovelluksen Generics tekee työskentelystä niin helppoa?

Se auttaa tekemään kokoelmasi tyyppiturvallisena ja varmistamaan siten, että koodisi ei epäonnistu myöhemmässä vaiheessa ajoaikapoikkeuksen vuoksi. Se säästää myös kooderia joutumasta tarkastamaan jokainen kokoelman objekti, mikä tekee koodikehityksen nopeammaksi ja helpommaksi. Hyödyntämällä yleisiä luokkia ja menetelmiä, koodia voidaan myös käyttää uudelleen käyttöönoton aikana vaaditulle tietotyypille.

Mitä muuta voit tehdä Java-sovelluksen Generics kanssa?

Toistaiseksi olemme nähneet, kuinka voimme saavuttaa tyyppiturvallisuuden ja koodin uudelleenkäytettävyyden geneeristen lääkkeiden avulla. Katsokaamme nyt muita ominaisuuksia, joita geneeriset tuotteet tarjoavat. He ovat:

  1. Rajatut ja useita rajoitettuja tyyppejä
  2. Kirjoita jokerimerkit

Rajattu tyyppi: Jos kyseessä on rajattu tyyppi, parametrin datatyyppi on rajoitettu tietylle alueelle. Tämä saavutetaan avainsanan "laajenee" avulla.

Tarkastellaan esimerkiksi yleistä luokkaa, jolla on rajoitettu tyyppiparametri, joka laajentaa Suoritettavia rajapintoja:

class myGenericClass()

Nyt, kun luot objektin toiseen luokkaan:

myGenericClass myGen = new myGenericClass();

Yllä oleva lausunto suoritetaan täydellisesti ilman virheitä. Toisin sanoen rajatun tyypin tapauksessa voit ohittaa saman luokkatyypin tai sen alaluokkatyypin. Voit myös sitoa parametrityypin käyttöliittymään ja siirtää sen toteutuksia kutsuttaessa sitä, kuten yllä olevassa esimerkissämme.

Mitä tapahtuu, jos yrität käyttää muun tyyppisiä parametreja?

myGenericClass myGen = new myGenericClass();

Yllä olevassa tapauksessa saat käännösajan virheen, jossa lukee: "Rajallinen epäsuhta: Tyyppi Kokonaisluku ei ole kelvollinen korvike tyypin myGenericClass tyypin kanssa".

Useita rajattuja tyyppejä: Jos kyseessä on useita rajoitettuja tyyppejä, voimme sitoa parametritietotyypin useampaan kuin yhteen tyyppiin. Esimerkiksi,

Class myGeneric()

Tässä tapauksessa voit ohittaa minkä tahansa tyyppisen, joka laajentaa numeroluokkaa ja toteuttaa Runnable-käyttöliittymän. Käytettäessä useita rajoitettuja tyyppejä on kuitenkin huomioitava muutama asia:

  1. Emme voi laajentaa useampaa kuin yhtä luokkaa kerrallaan.
  2. Voimme laajentaa mitä tahansa rajapintojen lukumäärää kerrallaan, jolloin rajapinnoille ei ole mitään rajaa.
  3. Luokan nimen tulisi aina olla ensin ja seuraa käyttöliittymän nimi, ellei se johda käännösajan virheeseen.

Tyypin jokerimerkit: Niitä edustaa ”?” - kysymysmerkin symboli. Siinä käytetään kahta pääavainta:

ulottuu (ylemmän rajan määrittelemiseksi) ja super (alarajojen määrittelemiseksi).

Esimerkiksi,

ArrayList al

Tämä ArrayList-objekti “al” sisältää kaikki tyypin T tiedot ja kaikki sen alaluokat.

ArrayList al

Tämä ArrayList-objekti “al” sisältää kaikki tyypin T tiedot ja kaikki sen superluokat.

Genericin edut Java-ohjelmassa

1. Joustavuus : Generics tarjoaa koodillemme joustavuuden mukauttaa erilaisia ​​tietotyyppejä geneeristen luokkien ja menetelmien avulla.

2. Koodin ylläpito ja uudelleenkäytettävyys : Geneeristen luokkien ja menetelmien takia koodia ei tarvitse kirjoittaa uudelleen, jos vaatimukset muuttuvat myöhemmässä vaiheessa, mikä helpottaa koodin ylläpitämistä ja uudelleenkäyttöä.

3. Tyyppiturvallisuus: Tarjoaa tyyppiturvallisuuden keräyskehykselle määrittelemällä tietotyyppi, jota kokoelma voi pitää yllä, ja eliminoimalla ClassCastExceptionin aiheuttamat epäonnistumismahdollisuudet ajon aikana.

4. Kirjanpitotarpeen poistaminen: Koska kokoelmien hallussa olevat tietotyypit on jo määritetty, sitä ei tarvitse kirjoittaa laskentahetkellä. Tämä lyhentää koodin pituutta ja myös kooderin työtä.

Java-taitojen geneerit

Jotta voisit työskennellä Genericsin kanssa, sinun tulee olla hyvin perehtynyt Java-perusteisiin. Sinun tulisi ymmärtää, kuinka tyyppitarkastus ja tyyppivalu toimivat. Perusteellinen tuntemus muista käsitteistä, kuten menetelmien ylikuormitus, vanhempien ja lasten luokkien välinen suhde, rajapinnat ja niiden toteutukset ovat välttämättömiä. Myös primitiivisten tietotyyppien (järjestelmän määrittelemä tietotyyppi) ja objektien (käyttäjän määrittelemä tietotyyppi) välisen eron ymmärtäminen on erittäin tärkeää, kun kyse on työstä keräyskehyksen kanssa.

Miksi meidän pitäisi käyttää Genericiä Java-sovelluksessa?

Geneeristen tuotteiden avulla koodi on ylläpidettävämpi, koska se vähentää tarvetta kirjoittaa tietotyyppikohtainen koodi joka kerta, kun vaatimukset muuttuvat. Käyttämällä geneerisiä rajoitettua tyyppiä voit rajoittaa tietotyyppiä ja samalla tarjota joustavuutta koodillesi määrittelemällä sen alue. Koodisi epäonnistuu todennäköisesti myöhemmässä vaiheessa, koska se tarjoaa tyyppiturvallisuuden, joten koodisi on vähemmän alttiina virheille.

Soveltamisala Java-geneerikoille

Geneeristen tuotteiden laajuus on rajoitettu koota aikaa. Tämä tarkoittaa, että geneerisiä käsitteitä voidaan käyttää vain kokoamisaikana, mutta ei ajoaikana. Esimerkiksi,

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

Tässä kaikki edellä mainitut neljä väitettä ovat yksi ja sama. Ne sallivat minkä tahansa tyyppisten tietojen lisäämisen luetteloobjektiin.

johtopäätös

Generics tekee koodauksen helpoksi kooderille. Se vähentää mahdollisuuksia kohdata ClassCastException ajon aikana tarjoamalla vahvaa tyyppitarkistusta. Poistaa kokonaan tyyppivalun tarpeen, mikä tarkoittaa, että vähemmän koodia on kirjoitettava. Se tarjoaa meille mahdollisuuden kehittää yleisiä algoritmeja, jotka ovat riippumattomia tietotyypistä, jonka kanssa he työskentelevät.

Suositellut artikkelit

Tämä on opas kohtaan Mikä on Generics Java -sovelluksessa ?. Täällä keskustelimme Java-tekniikan taitoista, laajuudesta, työskentelystä, ymmärtämisestä ja hyödyllisyydestä. Voit myös käydä läpi muiden ehdotettujen artikkeleidemme saadaksesi lisätietoja -

  1. Mikä on yleinen yhdyskäytävärajapinta
  2. Kuinka asentaa Java 8
  3. mikä on soapUI
  4. Mikä on JavaScript?
  5. Java Booleans