Шта је генерика у Јави?

Генериц у Јави представљен је 2004. године као нова карактеристика Јава програмског језика и био је део издања ЈДК 5. Најчешће се користи заједно са оквиром Јава колекција. Данас је то једна од најистакнутијих и најтраженијих карактеристика Јава програмског језика.

Генеричку Јаву пронашле су четири особе, а то су Гилад Брацха, Мартин Одерски, Давид Стоутамире и Пхилип Вадлер 1998. године. То је био проширење Јава језика који је подржавао генеричке типове. Замишљено је да се постигну два главна циља који су:

  1. Сигурност типа
  2. Поновна употреба кода

Дефиниција генерике у Јави

Генерички подаци могу се дефинисати као начин постизања поновне употребе кода дефинисањем генеричких класа, интерфејса, конструктора и метода који се могу користити са различитим типовима података, а такође постижу и безбедност типа изјављивањем врсте података која се користи у имплементацији пре него што се елиминира шансе за грешку у току рада.

Како се генерички имплементирају у Јави?

Генерички се примјењују помоћу кутних заграда „”. У заградама се налази параметар типа „Т“. Пример, . Параметар типа „Т“ је држач места што указује да ће му тип података бити додељен у време покретања. На пример, генеричка класа ће бити дефинисана као:

public class MyGenericClass (…)

Следе стандардни параметри типа:

  • Т: Упишите
  • Е: Елемент
  • Н: Број
  • К: Кључ
  • В: Вредност

С, У, В и тако даље се користе за дефинисање другог, трећег и четвртог параметра, у случају да се користи вишепараметар.

Разумевање генерике у Јави

До сад се можда питате шта је безбедност типа и како функционише? Или како се генеричке класе, интерфејси, конструктори и методе разликују од наших редовних класа и метода због којих се они поново користе? Хајде да сазнамо.

Јава као статички куцани језик захтева од вас да изјавите „тип“ који је тип података вредности коју променљива држи пре него што је користите.

Пример: String myString =”eduCBA”;

Овде је "Стринг" тип података, "миСтринг" је променљива која ће садржати вредност чији је тип Стринг.

Ако покушате да уместо низа покушате да пренесете логичку вредност, на пример:

String myBooleanStr = true;

Одмах ћете добити грешку у времену превођења тако да пише „Упишите неусклађеност: не може се претворити из боола у Стринг“.

Како постижемо поновну употребу кода генеричким производима?

Сада ћемо дефинисати редовну методу:

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

Овај метод се може позвати само преношењем низа параметра. На пример:

welcome(“eduCBA”);

Резултат ће му бити „добродошао у едуЦБА“.

Међутим, не можете позвати ову методу заобилазећи било које друге типове података као што су цели или боолеан. Ако покушате да то учините, биће вам затражено грешка у времену превођења која каже „Метода добродошлице (Стринг) у типу Руннер није применљива за аргументе (боолеан)“. Значи да не можете пренијети ниједну другу врсту података методи која само прихвата низ као параметар.

То такође значи да ако желите позвати сличну методу за други тип података, тада ћете морати написати нови метод који прихвата потребан тип података као параметар. Ова карактеристика метода преписивања са параметрима различитих типова података такође је позната и као преоптерећење метода. Главни недостатак тога је повећавање величине вашег кода.

Међутим, такође бисмо могли користити Генерицс да бисмо поново написали горњу методу и користили је за било који тип података који нам је потребан.

Дефинисање генеричке методе:

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

Напомена : Овде је „т“ објект типа Т. Т ће се доделити врста података која се користи за позивање методе.

Сада можете поново користити ову методу тако што ћете је позвати за низ када је потребно или боолеан или цијели број или било који други тип података.

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

Горе наведене изјаве дају следеће резултате:

То је Едуца
То је 1
То је тачно

Стога овде, користећи генеричке податке, можемо поново да користимо нашу методу за различите типове података.

Како постижемо сигурност типа употребом генерике?

Једна од главних разлика између Арраис-а и Цоллецтион-а је та што Арраис-и могу похранити само хомогене податке, док Цоллецтион-и могу похранити хетерогене податке. То јест, збирке могу да похране било који кориснички / дефинисани тип података / објекте.

НАПОМЕНА: Колекције могу садржавати само објекте (кориснички дефинирани тип података), а не примитивни тип података. Да бисте радили са примитивним подацима, збирке типа користе класе омота.

Сада, размотримо АрраиЛист.

ArrayList myList = new ArrayList();

Додајмо податке типа Стринг, Интегер и Доубле у АрраиЛист објект.

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

На испису АрраиЛист објекта можемо видети да он садржи следеће вредности: (едуЦБА, 1, 5.2).

Ако желите да преузмете ове вредности у варијабле, морат ћете их откуцати.

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

У случају да не откуцате, бит ће вам затражено грешка у току компилације која каже „Неподударање типа: не може се претворити из објекта у низ“.

Из овога можете закључити да док преузимате објекте са свог АрраиЛиста, требате их откуцати на њихове одговарајуће типове. Питање које се поставља овде је како ћете знати у који тип података да га унесете? У реалном времену, ваш АрраиЛист ће садржавати хиљаде записа и њихово уврштавање у различите типове података за сваки појединачни објект неће бити опција. Могли бисте да га унесете у погрешан тип података. Шта се онда догоди?

Овог пута нећете добити грешку у времену компилације, али ће извршити грешку у току извођења, наводећи „Изузетак у нити„ главни “јава.ланг.ЦлассЦастЕкцептион: јава.ланг.Интегер не може бити пребачен на јава.ланг.Стринг на цом.сервицеЦласесс.Руннер .маин (Руннер.јава:43) ”.

Будући да не можемо гарантовати врсту података који се налазе у колекцији (у овом случају АрраиЛист), сматра се да нису сигурни за употребу у односу на тип. Овде се играју генерички производи који пружају сигурност типа.

Коришћење АрраиЛист-а са Генерицс-ом:

ArrayList myList = new ArrayList();

Имајте на уму да је унутар угаоних заграда "" наведен тип стринга што значи да ова посебна имплементација АрраиЛист-а може да садржи само податке врсте стринга Ако покушате да додате било који други тип података на то, то ће једноставно бацити грешку у састављању времена. Овде сте учинили свој АрраиЛист сигурним типом елиминишући шансу за додавање другачије врсте података осим „Стринг“.

Сада када сте одредили тип података који је дозвољено додавање у вашу колекцију уз помоћ генерике, више не требате да је куцате док преузимате своје податке. То јест, можете једноставно преузети своје податке тако што ћете написати:

String someStr = myList.get(0);

Како Генерицс у Јави чини рад тако лаким?

То вам помаже да ваше колекције буду сигурне за тип, па се тако осигура да ваш код не успије у каснијој фази због изузетака из времена рада. Такође штеди кодер од потребе да укуца сваки предмет у колекцији чинећи бржи и лакши развој кода. Коришћењем генеричких класа и метода такође се може поново користити код према захтеваном типу података током имплементације.

Шта још можете учинити са Генерицима на Јави?

До сада смо видели како с генериком можемо постићи врсту заштите и поновну употребу кода. Сада погледајмо остале функције које генеричари пружају. Су:

  1. Ограничени и вишеструко ограничени типови
  2. Унесите заштитне знакове

Ограничени тип: У случају ограниченог типа, тип података параметар је ограничен на одређени распон. То се постиже помоћу кључне речи "ектендс".

На пример, размотримо генеричку класу са ограниченим параметром типа који проширује Руннабле интерфејс:

class myGenericClass()

Сада, док креирате свој објект у другој класи:

myGenericClass myGen = new myGenericClass();

Горе наведена изјава савршено ће се извршити без икаквих грешака. То је у случају ограниченог типа, можете пренијети исти тип класе или његов тип подређене класе. Такође, можете повезати врсту параметра за интерфејс и проследити његове имплементације када га позовете, као у случају нашег претходног примера.

Шта се догађа ако покушате користити било коју другу врсту параметра?

myGenericClass myGen = new myGenericClass();

У горњем случају, добићете грешку у току компилације и навести „Неповезана веза: Тип Интегер није валидна замена за типецаст типа миГенерицЦласс“.

Вишеструко ограничени типови: У случају вишеструко ограничених типова, можемо повезати врсту података параметра на више врста. На пример,

Class myGeneric()

У овом случају можете проћи било који тип који проширује бројчану класу и имплементира Руннабле интерфејс. Међутим, при кориштењу вишеструко ограничених врста треба имати на уму неколико ствари:

  1. Не можемо истовремено да проширимо више класа.
  2. Можемо проширити било који број интерфејса у исто време када нема ограничења за интерфејсе.
  3. Назив класе увек треба прво да следи име интерфејса, ако не, то ће довести до грешке у времену компилације.

Тип Вилдцардс: Они су представљени са "?" - симболом упитника. Користе две главне кључне речи:

се протеже (за дефинисање горње границе) и супер (за дефинисање доњих граница).

На пример,

ArrayList al

Овај АрраиЛист објект „ал“ садржи све податке типа Т и све његове подразреде.

ArrayList al

Овај АрраиЛист објект „ал“ садржи све податке типа Т и све његове суперкласе.

Предности Генерике у Јави

1. Флексибилност : Генерички пружа наш код флексибилност за прилагођавање различитих типова података уз помоћ генеричких класа и метода.

2. Одржавање и поновна употреба кода : Због генеричких класа и метода не треба поново писати код, у случају промене захтева у каснијој фази што олакшава код за одржавање и поновну употребу.

3. Сигурност типа: Обезбеђује безбедност типа оквира оквира за прикупљање дефинишући врсту података коју колекција може да претходно поседује и елиминише било какве шансе за неуспех у време рада због ЦлассЦастЕкцептион.

4. Елиминисање потребе за уносом података: Будући да су типови података у збиркама већ одређени, не треба их уносити у тренутку преузимања. То смањује дужину кода и такође смањује напор кодирача.

Генерика у Јава вештинама

Да бисте радили са Генерицима, требали бисте се добро упознати са основама Јаве. Требали бисте разумјети како функционише провјера типа и ливење типа. Потребно је темељно знање о другим концептима као што су преоптерећење метода, однос између родитеља и дечије класе, сучеља и њихове имплементације. Такође је разумевање разлике између примитивних типова података (системски дефинисан тип података) и објеката (тип података који одређује корисник) од пресудног значаја када је у питању рад са оквиром за прикупљање.

Зашто бисмо на Јави требали користити Генериц?

Коришћење генерике чини наш код одрживијим, јер смањује потребу за преписивањем кода специфичног за тип података, сваки пут када се промени потреба. Кориштењем генерички ограниченог типа можете ограничити тип података и истовремено пружити флексибилност вашем коду дефинирањем његовог распона. Мање је вјероватно да ваш код неће успјети у каснијој фази јер пружа сигурност типа што ваш код чини мање склоним грешкама.

Опсег за генерику на Јави

Обим генерике је ограничен на време састављања. То значи да је генерички концепт применљив само у време компилације, али не и у време извршавања. На пример,

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

ArrayList myList = new ArrayList();

Овде су све горе наведене четири изјаве једно те исто. Они ће омогућити додавање било које врсте података објекту листе.

Закључак

Генерички кодирање олакшава кодер. Умањује шансе да се током трчања сусрећу са ЦлассЦастЕкцептион-ом пружајући снажну проверу типа. Потпуно елиминише потребу за ливењем типа што значи да се мора писати мање кода. Омогућује нам изводљивост да развијемо генеричке алгоритме који су независни од врсте података са којима раде.

Препоручени чланци

Ово је водич за шта су генерички на Јави ?. Овде смо разговарали о вештинама, обиму, раду, разумевању и предност генеричких извора у Јави. Можете и да прођете кроз друге наше предложене чланке да бисте сазнали више -

  1. Шта је заједнички интерфејс пролаза
  2. Како инсталирати Јава 8
  3. шта је сапун
  4. Шта је ЈаваСцрипт?
  5. Јава Боолеанс

Категорија: