Što je generika u Javi?

Generic u Javi predstavljen je 2004. godine kao novo obilježje Java programskog jezika i bio je dio izdanja JDK 5. Najčešće se koristi zajedno s okvirom Java zbirki. Od danas je jedno od najistaknutijih i najtraženijih obilježja Java programskog jezika.

Generičku Javu pronašle su četiri osobe, a to su Gilad Bracha, Martin Odersky, David Stoutamire i Philip Wadler 1998. godine. Bio je to proširenje Java jezika koji je podržavao generičke tipove. Zamišljeno je da se postignu dva glavna cilja koji su:

  1. Vrsta sigurnosti
  2. Ponovna upotreba koda

Definicija generike u Javi

Generički podaci mogu se definirati kao način postizanja ponovne upotrebe koda definiranjem generičkih klasa, sučelja, konstruktora i metoda koje se mogu koristiti s različitim tipovima podataka, a također postižu sigurnost tipa izjavljivanjem vrste podataka koja se koristi u implementaciji prije početka, čime se eliminira šanse pogreške u radu.

Kako se generički implementiraju u Javi?

Generički se provode pomoću kutnih zagrada „”. U zagrade se nalazi parametar tipa „T“. Primjer, . Parametar tipa "T" označava mjesto mjesta što ukazuje da će mu tijekom izvođenja biti dodijeljen tip podataka. Na primjer, generička klasa bit će definirana kao:

public class MyGenericClass (…)

Ovo su standardni parametri tipa:

  • T: Upišite
  • E: Element
  • N: Broj
  • K: Ključ
  • V: Vrijednost

S, U, V i tako dalje koriste se za definiranje drugog, trećeg i četvrtog parametra u slučaju da se koriste višeparametri.

Razumijevanje generičkih podataka u Javi

Do sad se možda pitate što je vrsta sigurnosti i kako djeluje? Ili se razlikuju generičke klase, sučelja, konstruktori i metode od naših redovnih klasa i metoda zbog kojih ih se može ponovo upotrijebiti? Hajde da vidimo.

Java kao statički tipkan jezik zahtijeva da izjavite "tip" koji je tip podataka vrijednosti koju drži varijabla prije nego što je koristite.

Primjer: String myString =”eduCBA”;

Ovdje je "String" vrsta podataka, "myString" je varijabla koja će sadržavati vrijednost čiji je tip String.

Sada, ako pokušate proslijediti boolean vrijednost umjesto niza, na primjer:

String myBooleanStr = true;

Odmah ćete dobiti pogrešku u sastavljanju i navesti "Upišite neusklađenost: ne može se pretvoriti iz boola u String".

Kako postižemo ponovnu upotrebu koda generičkim proizvodima?

Sada ćemo definirati redovitu metodu:

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

Ova metoda može se pozvati samo prenošenjem niza parametra. Na primjer:

welcome(“eduCBA”);

Rezultat će mu biti "dobrodošao u eduCBA".

Međutim, ne možete pozvati ovu metodu zaobilazeći bilo koje druge vrste podataka, kao što su cijeli ili boolean. Ako to pokušate učiniti, pojavit će vam se pogreška u vremenu prevođenja uz napomenu da je metoda dobrodošlice (string) u tipu Runner nije primjenjiva za argumente (boolean). Znači da ne možete proslijediti nijednu drugu vrstu podataka metodi koja samo prihvaća niz kao parametar.

To također znači da ako želite pozvati sličnu metodu za drugu vrstu podataka, morat ćete napisati novu metodu koja prihvaća potrebnu vrstu podataka kao parametar. Ova značajka metoda prepisivanja s parametrima različitih vrsta podataka također je poznata kao preopterećenje metoda. Glavni nedostatak toga je povećavanje veličine vašeg koda.

Međutim, mogli bismo koristiti i Generic za prepisivanje gore navedene metode i koristiti je za bilo koju vrstu podataka koju trebamo.

Definiranje generičke metode:

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

Napomena : Ovdje je "t" objekt tipa T. T će se dodijeliti vrsta podataka koja se koristi za pozivanje metode.

Sada možete ponovo upotrijebiti ovu metodu tako što ćete je pozvati za niz ako je potrebno ili boole ili cijeli broj ili bilo koju drugu vrstu podataka.

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

Gore navedene izjave daju sljedeće rezultate:

To je Educa
To je 1
To je istina

Stoga ovdje korištenjem generičkih podataka možemo ponovno upotrijebiti našu metodu za različite vrste podataka.

Kako postižemo sigurnost tipa upotrebom generike?

Jedna od glavnih razlika između Arrays i Collection je što Arrays mogu pohraniti samo homogene podatke, dok Collections mogu pohraniti heterogene podatke. To jest Zbirke mogu pohraniti bilo koju vrstu / objekte podataka definirane od strane korisnika.

NAPOMENA: Zbirke mogu sadržavati samo objekte (korisnički definirani tip podataka), a ne primitivni tip podataka. Da biste radili s primitivnim podacima, zbirke vrsta koriste klase omota.

A sada, razmotrimo ArrayList.

ArrayList myList = new ArrayList();

U objekt ArrayList dodajmo podatke vrste String, Integer i Double.

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

Na ispisu ArrayList objekta možemo vidjeti da on sadrži sljedeće vrijednosti: (eduCBA, 1, 5.2).

Ako želite dohvatiti ove vrijednosti u varijable, morat ćete ih otkucati.

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

U slučaju da ne otkucate, bit će vam zatraženo greška u sastavljanju vremena koja navodi "Tip neusklađenosti: ne može se pretvoriti iz objekta u niz".

Iz ovoga možete zaključiti da dok preuzimate objekte s ArrayLista, trebate ih tipkati u njihove odgovarajuće tipove. Pitanje koje se ovdje postavlja je kako ćete znati u koji tip podataka da ga upišete? U stvarnom vremenu vaš će ArrayList sadržavati tisuće zapisa i zapisivanje ih u različite tipove podataka za svaki pojedini objekt neće biti opcija. Možda ćete je upisati u pogrešnu vrstu podataka. Što se tada događa?

Ovog puta nećete dobiti pogrešku u sastavljanju, ali izbacit će pogrešku tokom izvršavanja navodeći "Izuzetak u niti" glavni "java.lang.ClassCastException: java.lang.Integer ne može biti dodijeljen java.lang.String na com.serviceClasess.Runner .main (Runner.java:43)”.

Budući da ne možemo jamčiti vrstu podataka koji se nalaze u zbirci (u ovom slučaju ArrayList), smatraju se da nisu sigurni za upotrebu s obzirom na vrstu. Ovo je mjesto gdje generički igraju u igri kako bi se osigurala sigurnost tipa.

Korištenje ArrayLista s generičkim podacima:

ArrayList myList = new ArrayList();

Obratite pažnju da je unutar kutnih zagrada "" naveden tip stringa što znači da ova posebna implementacija ArrayList može sadržavati samo podatke vrste String. Ako pokušate dodati bilo koju drugu vrstu podataka, to će jednostavno baciti pogrešku u sastavljanju vremena. Ovdje ste učinili svoj ArrayList sigurnim tipom uklanjanjem šanse za dodavanje drugačije vrste podataka osim „String“.

Sad kad ste odredili vrstu podataka koju je dopušteno dodavati u vašu kolekciju uz pomoć generike, više je ne trebate tipkati dok dohvaćate svoje podatke. To jest, jednostavno možete dohvatiti svoje podatke pišući:

String someStr = myList.get(0);

Kako Generic u Javi čini rad tako lakim?

To vam pomaže da vaše zbirke budu sigurne za tip, pa se tako osigurate da kôd ne uspije u kasnijoj točki zbog iznimke od vremena izvođenja. Također štedi koder od potrebe da tipkate svaki objekt u kolekciji čineći brži i lakši razvoj koda. Korištenjem generičkih klasa i metoda također se može ponovo koristiti kôd prema zahtijevanoj vrsti podataka tijekom implementacije.

Što još možete učiniti s Genericima na Javi?

Do sada smo vidjeli kako s generikom možemo postići vrstu sigurnosti i ponovnu upotrebu koda. Pogledajmo ostale značajke koje generički sadržaji pružaju. Oni su:

  1. Ograničene i višestruko ograničene vrste
  2. Unesite zamjenske znakove

Ograničeni tip: U slučaju ograničenog tipa, vrsta podataka parametra ograničava se na određeni raspon. To se postiže pomoću ključne riječi "extends".

Na primjer, razmotrimo generičku klasu s ograničenim parametrom tipa koji proširuje Runnable sučelje:

class myGenericClass()

Sada, dok stvarate svoj objekt u drugoj klasi:

myGenericClass myGen = new myGenericClass();

Gornja izjava izvrsno će se izvršiti bez ikakvih pogrešaka. To je u slučaju ograničenog tipa, možete proslijediti istu vrstu klase ili njenu podređenu vrstu razreda. Također, možete povezati vrstu parametra za sučelje i proslijediti njegove implementacije kada ga prizivate, kao u slučaju našeg gornjeg primjera.

Što se događa ako pokušate koristiti bilo koju drugu vrstu parametra?

myGenericClass myGen = new myGenericClass();

U gornjem slučaju dobit ćete pogrešku u sastavljanju i navesti "Nepovezana veza: Tip Integer nije valjana zamjena za typecast tipa myGenericClass".

Višestruko ograničeni tipovi: U slučaju višestruko ograničenih vrsta, možemo povezati vrstu podataka parametra na više vrsta. Na primjer,

Class myGeneric()

U ovom slučaju možete proći bilo koju vrstu koja proširuje brojčanu klasu i implementira Runnable sučelje. Međutim, kada koristite višestruko ograničene vrste, treba imati na umu nekoliko stvari:

  1. Istovremeno ne možemo produljiti više klasa.
  2. Istovremeno možemo proširiti bilo koji broj sučelja koja ne postoje ograničenja za sučelja.
  3. Uvijek mora prvo biti ime klase, a zatim naziv sučelja, ako ne, to će dovesti do pogreške u sastavljanju.

Vrsta nadoknade: Predstavljeni su znakom "?" - upitnikom. Koriste dvije glavne ključne riječi:

se proteže (za definiranje gornje granice) i super (za definiranje donjih granica).

Na primjer,

ArrayList al

Ovaj ArrayList objekt „al“ sadrži sve podatke tipa T i sve njegove podrazrede.

ArrayList al

Ovaj ArrayList objekt "al" sadrži sve podatke tipa T i sve njegove superklase.

Prednosti Generike u Javi

1. Fleksibilnost : Generički pruža naš kod fleksibilnost za prilagođavanje različitih vrsta podataka uz pomoć generičkih klasa i metoda.

2. Održavanje i ponovna upotreba koda : Zbog generičkih klasa i metoda ne treba ponovno pisati kôd, u slučaju promjene zahtjeva u kasnijoj fazi, što kôd olakšava održavanje i ponovnu upotrebu.

3. Sigurnost tipa: pruža sigurnost tipa okvira za prikupljanje definiranjem vrste podataka koju zbirka može unaprijed pohraniti i eliminirajući sve šanse za neuspjeh u vremenu rada zbog ClassCastException.

4. Otklanjanje potrebe za unosom podataka: Budući da su tipovi podataka koje posjeduju zbirke već određene, ne treba ih tipkati u trenutku pretraživanja. To smanjuje duljinu koda i također smanjuje napor kodirača.

Generički u Java vještinama

Da biste radili s Genericima, trebali biste se dobro upoznati s osnovama Jave. Trebali biste razumjeti kako funkcionira provjera tipa i lijevanje tipa. Potrebno je temeljno znanje o drugim konceptima kao što su preopterećenje metoda, odnos između roditelja i djeteta, klasa, sučelja i njihove implementacije. Razumijevanje razlike između primitivnih vrsta podataka (tip podataka koji definira sustav) i objekata (tip podataka koji definira korisnik) je presudno u radu s okvirom prikupljanja.

Zašto bismo u Javi trebali koristiti Generike?

Korištenje generika čini naš kôd održivijim, jer smanjuje potrebu za prepisivanjem koda specifičnog za tip podataka svaki put kada dođe do promjene zahtjeva. Korištenjem generički ograničenog tipa možete ograničiti vrstu podataka i istovremeno pružiti fleksibilnost kôdu definiranjem njegovog raspona. Manje je vjerojatnost da vaš kôd neće uspjeti u kasnijoj točki jer pruža sigurnost tipa što vaš kod čini manje sklonim pogreškama.

Opseg za generiku na Javi

Opseg generičkog materijala ograničen je na vrijeme sastavljanja. To znači da je generički koncept primjenjiv samo u vrijeme sastavljanja, ali ne i u vrijeme izvođenja. Na primjer,

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

Ovdje su sve gore navedene četiri izjave jedno te isto. Oni će omogućiti dodavanje bilo koje vrste podataka objektu popisa.

Zaključak

Generički kodiranje čini koder jednostavnim. Umanjuje šanse susreta s ClassCastExceptionom tijekom izvođenja pružajući snažnu provjeru tipa. Potpuno eliminira potrebu za lijevanjem tipa što znači da se mora pisati manje koda. Pruža nam izvedivost da razvijemo generičke algoritme koji su neovisni o vrsti podataka s kojom rade.

Preporučeni članci

Ovo je vodič za Što su generički na Javi ?. Ovdje smo razgovarali o vještinama, opsegu, radu, razumijevanju i prednost generičkih podataka na Javi. Možete i proći naše druge predložene članke da biste saznali više -

  1. Što je zajedničko sučelje gatewaya
  2. Kako instalirati Java 8
  3. što je sapunUI
  4. Što je JavaScript?
  5. Java Booleans

Kategorija: