Генеричке класе олакшавају поновну употребу. Учините свој код скалабилним и ефикасним користећи генеричке класе у Јави.

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

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

Креирање генеричког типа

Генерички тип је у суштини објекат, креиран помоћу класе или интерфејс. Дакле, за овај чланак ће генерички тип бити купац. Користећи пример апликације на нивоу предузећа, корисник представља ентитет у систему базе података. Овај систем базе података сервисира компанију за намештај која има три физичке локације у три различита града.

publicabstractclassCustomer{
private String name;
publicCustomer(String name){
this.name = name;
}
public String getName(){
return name;
}
}

Приметићете да апстрактан кључна реч у Цустомер декларација класе изнад. То значи да не можете креирати директан тип или објекат из Цустомер тип.

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

Ове три подкласе ће бити чврсти типови генеричког Цустомер тип. Први Цустомер поткласа ће садржати следећи код:

publicclassCity1CustomerextendsCustomer{
publicCity1Customer(String name){
super(name);
}
}

Креирање генеричке класе

Да бисте користили генерички тип, мораћете да имате генеричку класу или метод који прихвата овај тип као параметар. Да бисте креирали генеричку класу, једноставно морате да уметнете параметар типа у декларацију класе.

publicclassPromotion<T> {}

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

publicclassPromotion<TextendsCustomer> {}

Ажурирани код изнад осигурава да Промоција разред узима само Цустомер типови, то значи све подкласе Цустомер класа.

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

Постоји неколико начина да се приступи овом проблему. Можете креирати а Промоција родитељска класа и имају три подкласе за сваку локацију продавнице. Али пошто сваки Промоција има сличну структуру, на крају ћете писати дупли код, што је неефикасно (посебно јер већ радите са Цустомер подкласе).

Стога, а Промоција генеричка класа је једно од ефикаснијих решења овог проблема.

import java.util.ArrayList;

publicclassPromotion<TextendsCustomer> {

private String promoName;
private ArrayList winners = new ArrayList<>();

publicPromotion(String promoName){
this.promoName = promoName;
}

public String getPromoName(){
return promoName;
}

publicvoidaddCustomer(T customer){
if (winners.contains(customer)) {
System.out.println( customer.getName() + " is already a winner of this prize.");
} else {
winners.add(customer);
System.out.println( customer.getName() + " is a winner in the " + this.promoName);
}
}

publicintnumWinners(){
returnthis.winners.size();
}
}

Тхе Промоција генеричка класа има једну променљиву (промоНаме). Ова Јава класа прихвата колекцију купаца који су освојили промоцију (победници) и чува их у Структура података АрраиЛист. Да бисте додали новог купца у одређену промотивну колекцију, требало би да користите аддЦустомер() методом. Ако у било ком тренутку желите да сазнате број купаца који су у колекцији, можете да позовете нумВиннерс() методом.

Креирање колекција помоћу генеричке класе

Пре него што почнете да креирате колекције, мораћете да креирате клијенте.

publicclassMain{
publicstaticvoidmain(String[] args){
City1Customer john = new City1Customer("John Brown");
City1Customer kelly = new City1Customer("Kelly James");
City2Customer jane = new City2Customer("Jane Doe");
City3Customer jess = new City3Customer("Jess Smith");
}
}

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

Promotion city1promo = new Promotion("City1 Promo");
Promotion city2promo = new Promotion("City2 Promo");
Promotion city3promo = new Promotion("City3 Promo");

Уметање три реда кода изнад у Главни класа ће ефикасно креирати три промоције специфичне за тип (или специфичне за локацију). Дакле, само купци из продавнице на првој градској локацији (Цити1Цустомер) може бити победник у промоцији тог града (цити1промо).

city1promo.addCustomer(john);
city1promo.addCustomer(kelly);

Стога, додавање горњег кода у Главни класа ће произвести следећи резултат у конзоли:

Међутим, ако покушате да додате трећег купца на листу победника промоције у првом граду, ваш ИДЕ ће произвести грешку при компилацији.

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

city2promo.addCustomer(jane);

Замена погрешне линије кода оном изнад ће одштампати следећи излаз на конзоли:

Предности коришћења генеричких типова

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

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