Obecné třídy usnadňují opětovné použití. Udělejte svůj kód škálovatelným a efektivním pomocí generických tříd v Javě.
Generics je koncept programování, který vám umožňuje určit typ, který chcete uložit do kolekce. Obecným typem může být jakákoli neprimitivní hodnota. Tradiční parametry typu, které možná znáte, jsou řetězec a celé číslo.
Můžete však vytvořit jedinečný generický typ. Kromě toho můžete vytvořit generickou třídu a použít ji k vytvoření různých kolekcí pomocí generik.
Vytvoření obecného typu
Generický typ je v podstatě objekt, vytvořené pomocí třídy nebo rozhraní. Takže pro tento článek bude obecným typem zákazník. Pomocí vzorové aplikace na podnikové úrovni zákazník představuje entitu v databázovém systému. Tento databázový systém poskytuje služby nábytkářské společnosti, která má tři fyzická místa ve třech různých městech.
publicabstractclassCustomer{
private String name;
publicCustomer(String name){
this.name = name;
}
public String getName(){
return name;
}
}
Všimnete si abstraktní
klíčové slovo v Zákazník deklarace třídy výše. To znamená, že nemůžete vytvořit přímý typ nebo objekt z Zákazník typ.Vzhledem k tomu, že každé umístění fyzického obchodu bude mít jedinečný seznam zákazníků, aplikace bude muset mít tři podtřídy zákazníků, které implementujete pomocí koncept programování dědičnosti.
Tyto tři podtřídy budou pevnými typy pro generické Zákazník typ. První Zákazník podtřída bude obsahovat následující kód:
publicclassCity1CustomerextendsCustomer{
publicCity1Customer(String name){
super(name);
}
}
Vytvoření obecné třídy
Chcete-li použít obecný typ, musíte mít obecnou třídu nebo metodu, která tento typ přijímá jako parametr. Chcete-li vytvořit generickou třídu, stačí vložit parametr type do deklarace třídy.
publicclassPromotion<T> {}
Výše uvedený kód znamená, že povýšení třída je generická. To znamená, že povýšení třída používá typy k vytváření svých objektů. Nyní může deklarace třídy obsahovat kolekci objektů, kterými jsou řetězce, celá čísla, zákazníci a tak dále. Nábytkářská společnost však chce pouze povýšení třídy k vytváření objektů pomocí Zákazník typy.
publicclassPromotion<TextendsCustomer> {}
Aktualizovaný kód výše zajišťuje, že povýšení třída bere pouze Zákazník typy, to znamená všechny podtřídy Zákazník třída.
Vzhledem k tomu, že se jedná o tři prodejny, chce společnost pro každou prodejnu vytvořit jednu nezávislou propagaci. Údaje požadované pro tyto akce jsou podobné. Každá promo akce bude mít název a sbírku zákazníků, kteří v dané akci vyhráli.
K tomuto problému lze přistupovat několika způsoby. Mohli byste vytvořit a povýšení nadřazená třída a mají tři podtřídy pro každé umístění obchodu. Ale od každého povýšení má podobnou strukturu, skončíte psaním duplicitního kódu, což je neefektivní (zejména proto, že již pracujete s Zákazník podtřídy).
Proto a povýšení generic class je jedním z nejúčinnějších řešení tohoto problému.
import java.util.ArrayList;
publicclassPromotion<TextendsCustomer> {
private String promoName;
private ArrayListwinners = 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();
}
}
The povýšení generická třída má jednu proměnnou (promoName). Tato třída Java přijímá sbírku zákazníků, kteří vyhráli propagační akci (vítězové), a ukládá je do Datová struktura ArrayList. Chcete-li přidat nového zákazníka do konkrétní kolekce propagačních akcí, musíte použít addCustomer() metoda. Pokud chcete kdykoli zjistit počet zákazníků, kteří jsou v kolekci, můžete vyvolat numWinners() metoda.
Vytváření kolekcí pomocí obecné třídy
Než začnete vytvářet kolekce, musíte vytvořit zákazníky.
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");
}
}
The Hlavní class výše vytváří čtyři objekty zákazníků, z nichž každý patří do jednoho ze tří umístění prodejen. Chcete-li začít s vytvářením kolekcí, budete muset nejprve vytvořit propagační předměty (jeden pro každé umístění obchodu).
Promotion city1promo = new Promotion("City1 Promo");
Promotion city2promo = new Promotion("City2 Promo");
Promotion city3promo = new Promotion("City3 Promo");
Vložení tří řádků kódu výše do Hlavní třída efektivně vytvoří tři typově specifické (nebo lokační) propagace. Tedy pouze zákazníci z obchodu v prvním městě (Město1 Zákazník) může být vítězem propagace daného města (city1promo).
city1promo.addCustomer(john);
city1promo.addCustomer(kelly);
Proto přidání výše uvedeného kódu do Hlavní třída vytvoří v konzole následující výsledek:
Pokud se však pokusíte přidat třetího zákazníka do seznamu vítězů promo akce v prvním městě, vaše IDE způsobí chybu kompilace.
To proto, že ani jedno Jane ani Jess je zákazníkem obchodu v prvním městě. Vytváření generických typů a tříd je užitečné, protože zabraňuje tomu, aby tyto jednoduché chyby zůstaly nezachyceny a poškodily databázi systému. V malé aplikaci může být snadné odhalit chyby, jako je tato, ale v systému na podnikové úrovni mohou být chyby, jako je tato, nezachyceny.
city2promo.addCustomer(jane);
Nahrazení chybného řádku kódu výše uvedeným vytiskne do konzole následující výstup:
Výhody použití obecných typů
Z ukázkové aplikace v tomto článku můžete vidět, že hlavní výhodou použití obecných typů je kontrola typu v době kompilace. Bez kontroly typu by přidání Jane do některého ze tří propagačních seznamů nezpůsobilo chybu v době provádění, protože Jane je skutečně zákazníkem nábytkářské společnosti.
Generics také umožňuje několik dalších výhod včetně opětovné použitelnosti kódu a škálovatelnosti. Jak společnost expanduje do nových měst, můžete snadno vytvářet nové typy propagačních objektů, přičemž se budete do značné míry spoléhat na stávající kód. Obecné typy také umožňují vytvářet efektivní kód, což je nejvyšší priorita v procesu vývoje softwaru.