Diskuze: ArrayList + vysvětlení fce
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Ano, do kolekce ukládáš objekty. V tom se kolekce liší od pole. Do pole vkládáš konkrétní (finální) hodnoty.
Jinak k té první otázce - podle názvu metody jde o nezdařeného
singletona. Metoda vrací novou instanci třídy Contact.
Defakto v tomto případě je to to samé, pokud bys zavolal konstruktor této
třídy.
public class Contact {
public Contact() { // <-- tady je konstruktor
}
}
a v tomhle případě máš jedno, zda-li voláš novou instanci konstruktoru:
Contact contact = new Contact();
nebo to máš ve statické metodě, která vytvoří a vrátí novou instanci konstruktoru:
public static Contact nejakaMetoda() {
return new Contact();
}
Normálně je v tom několik rozdílů, ale tady v tomto konkrétním
případě je to fakt jedno.
Za jiných okolností platí:
private static Contact contact;
public static Contact createContact(String name, String phoneNumber){
if(contact == null) {
contact = new Contact(name, phoneNumber);
}
return contact;
}
Ale toto s dotazem nesouvisí:) jen ukázka, proč to třeba někdo takhle separuje do statické metody a nevytváří instance klasickým způsobem.
Proč bys nemohl do pole ukládat objekty? Rozdíl mezi seznamem (listem) a polem je ten, že do pole nemůžeš přidávat další prvky nebo je mazat. Není to nezdařilý Singleton, ale úplně normální Factory method, přečti si návrhové vzory pro vytváření - https://www.itnetwork.cz/…ro-vytvareni Je pravda, že je tam trochu k ničemu, když má ty samé parametry jako má konstruktor.
Jo máš recht, že to jde. Ono taky jde, že nemusíš vytvářet metody ani
jakoukoli strukturu programu, ale všechno narveš do jedné metody a použiješ
tisíc podmínek.
Ale myslel jsem, (a popravdě proto tyto stránky propaguju) že právě tento
portál je proto, abychom radili všem, jak psát programy trošku na nějaké
úrovni. Ale jestli se tady budeme bavit, jak programovat strukturovaně v
Javě, tak sem přidejte obsáhlý tutorial pro programování v jedničkách a
nulách-.-
Osobně nevidím smysl, proč by někdo do pole rval objekty. Když už
používám pole, tak právě proto, abych urychlil běh programu. Přece jen je
rychlejší, když s velkým počtem dat pracuju s primitivním datovým typem
než s objektovými. Už jen kvůli uložišti.
Navíc jsi to sám řekl - pole je konečný seznam, ze kterého můžeš jen
číst případně přepisovat index, ale snad uznáš, že je dobré, když
máš možnost objekt v budoucnu celý smazat (nebo zahodit). I když můžeš
nastavit hodnotu na null, pořád by sis v poli pamatoval nějakou referenci, i
když na null.
Je to věc názoru ok, ale když tak mi sem postni prosím příklad, kdy je
doopravdy skutečně výhodnější narvat objekty do pole než do kolekce.
S tou factory method máš pravdu. Já jsem to používal vždy jen tak (uznávám moje chyba, že jsem si to spojil hned od začátku tak, že to patří k sobě). Znám to, ale nikdy jsem to nepoužil separátně, ale to je chyba u mě, ne, že by to tak mělo být:) takže co se tohoto týče skláním uši a uznávám, že máš pravdu
U generických kolekcí primitivních typů máš ten problém, že je musíš boxovat/unboxovat, pokud jsi myslel toto. Ale třídy v Javě jsou referenční datové typy, takže tam boxing/unoxing není problém.
V tom případě je výhodnější použít ArrayList, než obyčejné pole, které ten ArrayList stejně používá vnitřně, viz http://hg.openjdk.java.net/…rayList.java. Navíc se automaticky zvětšuje/změnšuje velikost pole uvnitř.
A odpověď na druhý dotaz - normálně by sis mohl ukládat hodnoty stejného typu třeba do pole:
Contact[] myContacts;
ale s tím pak máš problém, že tam nemůžeš přidávat nové prvky, pokud budeš chtít používat jenom část pole, abys tam mohl něco přidávat, tak si musíš pamatovat počet prvků a navíc Ti pak stejně nemusí stačit jeho velikost.
Proto to můžeš obalit třídou, která se o toto bude starat a umožní Ti vkládání/mazání bez toho, aniž by ses musel starat o to, jak to funguje unvitř.
ContactArrayList myContacts;
A pak dojdeš k tomu, že bys třeba to samé potřeboval pro Phone, takže si vyrobíš podobnou třídu PhoneArrayList. Ale budeš v tom mít hodně podobný kód.
Proto přišla generika, kde máš nějakou třídu a tu můžeš specializovat na nějaký typ.
Třeba
ArrayList<Contact> myContacts;
kde to Contact ve špičatých závorkách specifikuje typ, na který se to specializuje. V tomto případě to znamená, že tam chceš ukládat instance od té třídy:
ArrayList<Contact> myContacts = new ArrayList<>();
myContacts.add(new Contact(...))
Zobrazeno 6 zpráv z 6.