Mi a Generics a Java-ban?

A Java általános generikumait 2004-ben vezették be a Java programozási nyelv új funkciójaként, és a JDK 5 kiadásának része volt. Szélesebb körben használják a Java gyűjtemények keretrendszerével együtt. Manapság ez a Java programozási nyelv egyik legszembetűnőbb és legkeresettebb tulajdonsága.

Az általános Java-t négy személy, nevezetesen Gilad Bracha, Martin Odersky, David Stoutamire és Philip Wadler találta 1998-ban. A Java nyelv kiterjesztése az általános típusokat támogatja. Két fő cél elérésére irányult, amelyek a következők:

  1. Típusbiztonság
  2. Kód újrafelhasználhatóság

Meghatározása Generics Java

A generikus termékeket úgy lehet meghatározni, hogy a kód újrafelhasználhatóságának eléréséhez az általános osztályok, interfészek, konstruktorok és módszerek meghatározása révén különféle adattípusokkal lehessen használni, és szintén elérjék a típusbiztonságot azáltal, hogy a végrehajtáshoz használt adattípust előzetesen deklarálják, ezáltal kiküszöbölve a futási hiba esélye.

Hogyan valósulnak meg a generikus gyógyszerek a Java-ban?

A generikus termékeket „” szögletes zárójelekkel valósítják meg. A zárójelben a „T” típusú paraméter található. Példa, . A „T” típusú paraméter egy helyőrző, amely jelzi, hogy az adattípust hozzárendelik hozzá futási időben. Például egy általános osztályt a következőképpen kell meghatározni:

public class MyGenericClass (…)

A következők a szokásos típusú paraméterek:

  • T: Típus
  • E: Elem
  • N: Szám
  • K: Kulcs
  • V: Érték

S, U, V és így tovább használják a második, a harmadik és a negyedik paraméter meghatározását abban az esetben, ha több paramétert használnak.

A Generic Java megértése

Mostanra már azon tűnődhet, hogy mi a típusbiztonság és hogyan működik? Vagy hogyan különböznek az általános osztályok, interfészek, konstruktorok és módszerek a szokásos osztályoktól és módszerektől, amelyek újrahasznosíthatóvá teszik őket? Találjuk ki.

Ha a Java statikusan tipizált nyelv, akkor használatának megkezdése előtt be kell jelentenie a „type” -ot, azaz a változó által megtartott érték adattípusát.

Példa: String myString =”eduCBA”;

Itt a „karakterlánc” az adattípus, a „myString” az a változó, amely olyan értéket fog tartani, amelynek típusa karakterlánc.

Ha most megpróbálunk egy logikai értéket átadni egy karakterlánc helyett, például:

String myBooleanStr = true;

Azonnal fordítási idő hibaüzenetet kap, amely a következőt mondja: „Type mismatch: nem tud átalakítani logikai értékről String-re”.

Hogyan érjük el a kód újrafelhasználhatóságát a Generics alkalmazásával?

Most határozza meg a szokásos módszert:

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

Ez a módszer csak string paraméter átadásával indítható meg. Például:

welcome(“eduCBA”);

Kimenetét „szívesen látjuk az eduCBA-nál”.

Ezt a módszert azonban nem lehet meghívni más adattípusok, például egész szám vagy logikai érték megkerülésével. Ha megpróbálja ezt megtenni, akkor fordítási idő hibaüzenetet fog kérni, amelyben fel van tüntetve: „A Runner típusú üdvözlő módszer (karakterlánc) nem alkalmazható az argumentumokra (logikai)”. Azaz nem adhat át semmilyen más adattípust olyan módszernek, amely csak egy karakterláncot fogad el paraméterként.

Ez azt is jelenti, hogy ha hasonló módszert kíván meghívni egy másik adattípusra, akkor új módszert kell írnia, amely paraméterként elfogadja a szükséges adattípust. A különféle adattípusok paramétereivel történő újraírási módszer ez a módszer túlterhelésként is ismert. Ennek legfőbb hátránya, hogy megnöveli a kód méretét.

Ugyanakkor a Generics eszközt is felhasználhatjuk a fenti módszer átírásához, és bármilyen adattípushoz felhasználhatjuk.

Általános módszer meghatározása:

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

Megjegyzés : Itt a „t” egy T típusú objektum. A T-hez hozzárendelésre kerül az adattípus, amelyet a módszer meghívására használnak.

Most újra felhasználhatja ezt a módszert úgy, hogy szükség esetén meghívja egy karakterláncra, logikai értékre, egész számra vagy bármilyen más adattípusra.

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

A fenti állítások az alábbiak szerint szolgáltatják:

Ez Educa
Ez 1
Az igaz

Ezért a generikus termékek felhasználásával itt újra felhasználhatjuk módszerünket különféle adattípusokra.

Hogyan érjük el a típusbiztonságot a Generics segítségével?

Az egyik legnagyobb különbség a tömbök és a gyűjtés között az, hogy a tömbök csak homogén adatokat tárolhatnak, míg a gyűjtemények heterogén adatokat tárolhatnak. Vagyis a gyűjtemények bármilyen felhasználó által meghatározott adattípust / objektumot tárolhatnak.

MEGJEGYZÉS: A gyűjtemények csak objektumokat (felhasználói által meghatározott adattípus) tárolhatnak, és nem primitív adattípusokat. A primitív adatokkal való együttműködéshez a típusgyűjtemények wrapper osztályokat használnak.

Most nézzük meg egy ArrayList-ot.

ArrayList myList = new ArrayList();

Adjunk hozzá String, Integer és Double típusú adatokat az ArrayList objektumhoz.

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

Az ArrayList objektum nyomtatásakor láthatjuk, hogy az alábbi értékekkel rendelkezik: (eduCBA, 1, 5.2).

Most, ha ezeket az értékeket vissza szeretné venni változókba, akkor be kell írnia azokat.

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

Abban az esetben, ha nem írja be a tipastast, akkor a rendszer egy fordítási idõ hibaüzenetet kéri, amely a következõ szöveget írja be: “Type neatmat: nem tudja konvertálni az objektumból karakterlánccá”.

Ebből arra a következtetésre juthat, hogy miközben az objektumokat beolvassa az ArrayListből, el kell tipizálnia azokat a megfelelő típusukba. Az itt felmerülő kérdés az, hogy hogyan fogja tudni, hogy mely adattípust kell tipizálni? Valós időben az ArrayList több ezer rekordot fog tartalmazni, és minden objektumra különféle adattípusokra történő tipizálás nem lesz opció. Előfordulhat, hogy rossz adattípust ad ki. Mi történik akkor?

Ezúttal nem fog fordítási idő hibát kapni, hanem futásidejű hibát fog dobni, amely a következőt tartalmazza: „Kivétel a szálban” main .main (Runner.java:43)”.

Mivel nem tudjuk garantálni a gyűjteményben jelen lévő adatok típusát (ebben az esetben ArrayList), ezeket a típus szempontjából nem biztonságos használni. A generikus gyógyszerek itt játszanak szerepet a típusbiztonság érdekében.

Az ArrayList használata a Generics programmal:

ArrayList myList = new ArrayList();

Vegye figyelembe, hogy a „” szögletes zárójelek belsejében a karakterlánc típusa van megadva, ami azt jelenti, hogy az ArrayList adott megvalósítása csak a karakterlánc típusú adatokat képes tárolni. Ha megpróbál hozzáadni más adattípust, akkor egyszerűen eldobja a fordítási idő hibát. Itt az ArrayList típusbiztonságossá tette azáltal, hogy kiküszöbölte annak eshetőségét, hogy más, a „String” -tól eltérő adattípust adjon hozzá.

Most, hogy meghatározta azt az adattípust, amelyet a generikumok segítségével fel lehet adni a gyűjteményhez, az adatok lekérdezése során nem kell továbbírnia. Vagyis egyszerűen lekérdezheti adatait azáltal, hogy megírja:

String someStr = myList.get(0);

Hogyan könnyíti meg a Java alkalmazásban a Generics a munkát?

Ez elősegíti a gyűjtemények biztonságosságát, ezáltal biztosítva, hogy kódja később nem fog hibásodni futási idő kivétel miatt. Ezenkívül megóvja a kódolót attól, hogy a gyűjtemény minden objektumát el kell írnia, így a kódfejlesztés gyorsabb és könnyebb. Általános osztályok és módszerek alkalmazásával a kódot ismételten felhasználhatjuk a végrehajtás során szükséges adattípus szerint.

Mit tehetne még a Java alkalmazásban a Generics programmal?

Eddig láttuk, hogyan lehet a típusbiztonságot és a kód újrafelhasználhatóságát elérni a generikus gyógyszerekkel. Most nézzük meg a generikus készülékek többi funkcióját. Ők:

  1. Korlátozott és többszörös korlátozott típusok
  2. Írja be a helyettesítő karaktereket

Határolt típus: Korlátozott típus esetén a paraméter adattípusa egy meghatározott tartományra korlátozódik. Ezt a „kiterjesztés” kulcsszó segítségével érjük el.

Például vegyünk egy általános osztályt egy korlátozott típusú paraméterrel, amely kiterjeszti a futtatható felületet:

class myGenericClass()

Míg az objektumot egy másik osztályban hozza létre:

myGenericClass myGen = new myGenericClass();

A fenti állítás hibátlanul tökéletesen végrehajtódik. Vagyis a korlátozott típusú esetén átadhatja ugyanazt az osztálytípust, vagy annak gyermekosztályt. Ugyancsak kötheti a paraméter típust egy interfészhez és átadhatja annak megvalósításait, amikor meghívja, mint a fenti példánkban.

Mi történik, ha megpróbál más típusú paramétert használni?

myGenericClass myGen = new myGenericClass();

A fenti esetben fordítási idő hibaüzenetet kap, amely a következőt mondja: „Összekötött eltérés: Az Integer típus nem helyettesíti a myGenericClass típus típuspecastast”.

Több korlátozott típus: Több korlátozott típus esetén a paraméter adattípust egynél több típushoz is köthetjük. Például,

Class myGeneric()

Ebben az esetben átadhat bármilyen típust, amely kiterjeszti a Számosztályt és megvalósítja a Runnable felületet. Több korlátozott típus használatakor azonban néhány dolgot kell megjegyezni:

  1. Egyszerre csak egy osztályt terjeszthetünk ki.
  2. Egyszerre tetszőleges számú felületet bővíthetünk, amelyre nincs korlátozás.
  3. Az osztálynévnek mindig először az interfész nevet kell követnie, ha nem, fordítási idő hibát eredményez.

Típus helyettesítő karakterek: őket „?” - kérdőjel szimbólum jelöli. Két fő kulcsszót használ:

kiterjed (a felső határ meghatározására) és a szuper (az alsó határ meghatározására).

Például,

ArrayList al

Ez az „al” ArrayList objektum minden T típusú adatot és annak összes alosztályát tárolja.

ArrayList al

Ez az „al” ArrayList objektum tárolja a T típusú adatokat és annak szuperosztályait.

A Generics előnyei a Java-ban

1. Rugalmasság : A Generics biztosítja a kódunk rugalmasságát a különféle adattípusok befogadására általános osztályok és módszerek segítségével.

2. Kódkarbantartás és újrafelhasználhatóság : Az általános osztályok és módszerek miatt nem kell a kódot újraírni, ha egy későbbi szakaszban változnak a követelmények, megkönnyítve a kód karbantartását és újrafelhasználását.

3. Típusbiztonság: Típusbiztonságot biztosít a gyűjtési keretrendszer számára azáltal, hogy meghatározza az adat típusát, amelyet a gyűjtemény előzetesen megtarthat, és kiküszöböli a ClassCastException miatt a futás közbeni esetleges hibákat.

4. A mintavételi igény kiküszöbölése: Mivel a gyűjtemények által tárolt adattípusokat már meghatározták, nem szükséges, hogy azokat a lekérdezéskor tippessék. Ez csökkenti a kód hosszát és a kódoló erőfeszítéseit.

Általános Java ismeretek

A Generics-szel való együttműködéshez jól ismeri a Java alapjait. Meg kell értenie a típusvizsgálat és a casting működését. Más fogalmak alapos ismerete, például a módszer túlterhelése, a szülő és a gyermek osztályok közötti kapcsolat, interfészek és megvalósításuk szükséges. A primitív adattípusok (rendszer által meghatározott adattípus) és az objektumok (felhasználó által definiált adattípus) közötti különbség megértése szintén döntő jelentőségű a gyűjtési kerettel való munka során.

Miért kellene a Generics-t használni a Java-ban?

A generikus termékek használatával a kód fenntarthatóbbá válik, mivel ez csökkenti az adattípus-specifikus kód újraírásának szükségességét minden alkalommal, amikor a követelmények változnak. Általános korlátozott típus használatával korlátozhatja az adattípust, és ugyanakkor rugalmasságot biztosíthat a kódhoz, meghatározva annak tartományát. A kód később valószínűleg nem fog megbukni, mivel a típusbiztonságot nyújtja, így a kód kevésbé hajlamos a hibára.

A Java általános generikumainak hatálya

A generikus termékek körét az idő összeállítása korlátozza. Ez azt jelenti, hogy a generikus fogalom csak összeállítási időben, de futási időben nem alkalmazható. Például,

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

A fenti négy állítás itt ugyanaz. Lehetővé teszik bármilyen adat hozzáadását a lista objektumához.

Következtetés

A Generics megkönnyíti a kódolást egy kódoló számára. Erős típusú ellenőrzés révén csökkenti annak esélyét, hogy a ClassCastException alkalmazásba kerüljen futás közben. Teljes mértékben kiküszöböli a típusöntés szükségességét, ami azt jelenti, hogy kevesebb kódot kell írni. Ez lehetővé teszi számunkra, hogy általános algoritmusokat dolgozzunk ki, amelyek függetlenek az általuk használt adattípustól.

Ajánlott cikkek

Ez egy útmutató a Mi a Generics Java alkalmazásban című részében? Itt tárgyaltuk a Generics készségeit, alkalmazási körét, működését, megértését és előnyeit a Java-ban. A további javasolt cikkeken keresztül további információkat is megtudhat -

  1. Mi a közös átjáró interfész
  2. A Java 8 telepítése
  3. mi a soapUI
  4. Mi a JavaScript?
  5. Java logikai

Kategória: