Blog

Abstrakcia a zoraďovanie v kolekciách v Jave

Learn2Code tím - 08.12.2020 - Vzdělávání

Poďme sa porozprávať o abstraktných triedach v jave (abstract class in java). Abstrakcia slúži na schovanie zložitosti od používateľa a zobrazuje len relevantné informácie.

Abstraktné triedy a metódy

V našom príklade vieme, že všetky zvieratá vydávajú zvuk. Je to niečo abstraktné – niečo, čo si vieme predstaviť a v kóde to zapíšeme nasledovne. Upravme metódu v triede Animal.

public abstract void makeNoise();

Dáva to zmysel, lebo Animal nepredstavuje určité špecifické zviera a teda nevieme, aký zvuk vydá, ale vieme, že chceme aby všetko, čo bude dediť od Animal, vydávalo zvuk. Pomocou public abstract som povedal, že táto metóda nemusí mať vnútro – nemusí mať kód (implementáciu). Ak mám abstraktnú metódu, tak aj celá trieda musí byť abstract.

public abstract class Animal{
    public String name = "animal";
    public abstract void makeNoise();
}

Ak je trieda abstract, tak z nej nemôžem vyrobiť objekt. Načo by som aj robil objekt Animal, však je to len abstrakcia. Toto nebude fungovať:

Animal animal = new Animal();

Ak je Animal abstract a obsahuje abstract metódu, tak som povedal, že potomk musí napísať implementáciu abstract metódy alebo bude potom tiež abstract.

Nám vyhovuje, aby Mamal bol tiež abstract. Tým pádom nemusíme vyrobiť implemntáciu. Z triedy Mamal zmažeme makeNoise a označíme ju za abstract.

public abstract class Mamal extends Animal {
    public String name = "mamal";
}

Teraz triedy, ktoré dedia od Mamal musia implementovať metódu makeNoise. Cat a Dog už danú metódu implementujú, teda nemusíme nič robiť. Ale Fox túto metódu nemá a preto ju musíme implementovať. IntelliJ IDEA nám v tomto pomôže skratkou. Stlačíme Alt + Insert a vyberieme Implement Methods.

public class Fox extends Mamal {
    @Override
    public void makeNoise() {
        System.out.println("Ring-ding-ding-ding-dingeringeding!");
    }
}


Zoraďovanie v kolekciách

Pre zoraďovanie použijeme už existujúci algoritmus v triede Collections.sort(l). Písmeno l v tomto prípade bude List. Ak by tento List obsahoval sadu Stringov, boli by zoradené abecende, ak by obsahoval Dátum tak budú zoradene chronologicky. Ako je to možné? Je to preto, lebo tieto triedy implementujú rozhranie Comparable. Ak by si sa snažil takto zoradiť také triedy, ktoré neimplementujú toto rozhranie, tak program vyhodí výnimku.

Existuje ale možnosť, že v tvojej triede implementuješ toto rozhranie. Potom toto triedenie je teraz považované za prirodzené. Príklad: Máme Osobu, ktorá implementuje Comparable. Musíme implementovať metódu compareTo.

public class Osoba implements Comparable<Osoba>{
    private String meno;
    private String priezvisko;
    private int vek;
    public Osoba(String meno, String priezvisko, int vek) {
        this.meno = meno;
        this.priezvisko = priezvisko;
        this.vek = vek;
    }
    //get, set metódy vynechané pre čitatelnosť
    @Override
    public String toString() {
        return "Osoba{" +
                "meno='" + meno + '\'' +
                ", priezvisko='" + priezvisko + '\'' +
                ", vek=" + vek +
                '}';
    }
    @Override
    public int compareTo(Osoba o) {
        int porovnaniePriezvisk = o.getPriezvisko().compareTo(this.getPriezvisko());
        return porovnaniePriezvisk !=0 ? porovnaniePriezvisk : o.getMeno().compareTo(this.getMeno());
    }
}

Čo ak chceš použiť úplne iné ako prirodzené triedenie, chceš to triediť napríklad podľa veku. Alebo chceš triediť objekty, ktoré neimplementujú Comparable rozhranie? Tak si ho vyrobíš. Na to použiješ rozhranie Comparator a potom ho požiješ Collections.sort(e, VEK_TRIEDENIE);.

public class Sort {
    private static final Comparator<Osoba> VEK_TRIEDENIE = new Comparator<Osoba>() {
        @Override
        public int compare(Osoba o1, Osoba o2) {
            return Integer.compare(o1.getVek(), o2.getVek());
        }
    };

Vyskúšame si:

public static void main(String[] args) {
        Osoba[] osobyArray = {
                new Osoba("Jaro", "Beno", 20),
                new Osoba("Peter", "Beno", 25),
                new Osoba("Karol", "Slepec", 18),
                new Osoba("Tomas", "Vlak", 22)
        };
        List<Osoba> osoby = Arrays.asList(osobyArray);
        System.out.println(osoby);
        Collections.sort(osoby);
        System.out.println(osoby);
        Collections.sort(osoby, VEK_TRIEDENIE);
        System.out.println(osoby);
    }
}

V ďalších blogoch sa pozrieme na zopár zaujímavostí z Javy 13 a takisto sa budeme venovať aj Kotlinu. Ostaň nám verný a uč sa Javu 😊



Logo facebook

Learn2Code tím

Učíme ľudí dizajnovať, robiť webstránky a programovať. Naše prezenčné kurzy nájdeš vo viacerých mestách na Slovensku a pomocou online kurzov sa môžeš vzdelávať z pohodlia domova.


Funkcie VLOOKUP

Vzdělávání

Funkcia VLOOKUP sa používa vtedy, keď potrebujete nájsť údaje v tabuľke alebo rozsahu podľa riadka. Vyhľadajte napríklad cenu automobilovej časti podľa...

OOP v C++: trieda reprezentujúca valec a niečo viac

Vzdělávání

V úvode tohto blogu by som chcel pozdraviť všetkých nadšencov vyššieho programovacieho jazyka C++. V tomto blogu som si pre vás pripravil tému...

Digitálny svet v G-Suite

Vzdělávání

Žijeme v dobe, keď sú technológie už povinnou súčasťou našich životov. Postupne ako sme do tohto sveta vstupovali, tak sme si neboli ani vedomí, do...