Interface példányosítása mire jó?
Az még okés, hogy a referencia típusát szoktuk interface-val leírni és az objektum típusa az implementációs osztály lesz (lásd a Collenction-ök). De interface, mint objektum típus nekem új...
A lényeg, hogy a Comparator interface-t szeretném implementálni, de ugyanakkor szeretnék lehetőséget nyújtani, a többféle field alapján való rendezéshez.
public class MyClass {
public String vezNev;
public String kerNev;
public static final Comparator<MyClass> VEZNEV_ORDER = new Comparator<MyClass>() { // vezetéknév alapján
public int compare(MyClass e1, MyClass e2) {
return e1.vezNev.compareTo(e2.vezNev);
}
};
public static final Comparator<MyClass> KERNEV_ORDER = (MyClass e1, MyClass e2) -> e1.kerNev.compareTo(e2.kerNev); // keresztnév alapján lambda kifejezéssel, ez ne zavarjon be
}
Main:
Collections.sort(myList, MyClass.KERNEV_ORDER);
Működni működik csak pl: nem tudom, hogy a VEZNEV_ORDER típusa az mi? egy interface
segítsetek srácok :D
Szerintem nem interfészt példányosítasz (elég ha arra gondolsz, hogy azt nem is lehet!), hanem ez egy anonymous class.
Na szóval, interfészek.
Ugye vannak nekünk a világunkban különféle dolgaink. Ha egy kicsit jobban szétnézel, akkor találsz olyan dolgokat, amik tudnak valami közöset. Például van aggregátor, vízerőmű, atomerőmű, stb. Ezek tudnak nekünk áramot adni. És persze vannak más tárgyak, pl. a hajszárító, aminek meg pont áram kellene.
Így már rá is cuppanunk a kódolásra:
class Aggregátor {
.. public void getÁram() {...}
}
class Vízerőmű {
.. public void getÁram() {...}
}
class Hajszárító {
.. public [HOPPÁ! Mit írjak ide, hogy mindkettővel menjen?] Áramforrás;
.. //public Aggregátor Áramforrás; - Így csak Aggregátorral megy, Vízerőművel nem
.. //public Vízerőmű Áramforrás; - Így csak Vízerőművel megy, Aggregátorral nem
}
A lényeg itt az lenne, hogy az erőművek és az aggregátorok biztosítanak nekünk valamit. Ezeket a közös dolgokat kiemelhetjük interfészbe. Szóval az interfész nem más, mint egy megszorítás - minden olyan dolognak, ami megvalósít egy interfészt, tudnia kell az interfészben leírt dolgokat. Igazából a Hajszárítót nagyon nem érdekli, hogy honnan és hogyan lesz neki áram, az a lényeg, hogy legyen.
interface Áramforrás {
.. void getÁram();
}
class Aggregátor implements Áramforrás {
.. public void getÁram() {...}
}
class Vízerőmű implements Áramforrás {
.. public void getÁram() {...}
}
class Hajszárító {
.. public Áramforrás ÁF;
}
Így már menni fog a dolog:
Aggregátor a = new Aggregátor();
Vízerőmű v = new Vízerőmű();
Hajszárító h = new Hajszárító();
//Nem érdekel, mit adunk a hajszárítónak, az érdekel, hogy az a valami adjon áramot
h.ÁF = a;
h.ÁF = v;
Namármost vannak ún. névtelen osztályok. Ezt akkor használjuk, ha van egy interfész, és akarunk gyorsban írni valamit, ami azt megvalósítja (például a hívás helyén, vagy változóba berakni). Ez úgy néz ki, hogy (változós példa):
Interfész_neve változó_neve = new Interfész_neve() {
.. //ide írjuk az interfészt megvalósító osztály tagjait
}
köszi a válaszokat az utolsót még átbogarászom :)
ez már nagy rávezetés, hogy inteface i = new interface() igazából egy osztály lesz, csak éppen névtelen, éppen ezért mégis akartam neki nevet adni
public static final class VEZNEV_ORDER implements Comparator<MyClass> {
@Override
public int compare(MyClass e1, MyClass e2) {
return e1.vezNev.compareTo(e2.vezNev);
}
}
csakhát a main -ből nem lehet elérni az inner class compare metódusát :D
Collections.sort(mL, MyClass.VEZNEV_ORDER./*nem tudok semmit sem elérni */);
szóval még tanulmányozom
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!