Néhány szót ejtenék a paraméterezett típusokról, ugyanis nemrégiben olvastam róluk, és nekem totál nóvum volt a dolog, illetve nem, de azért mégis.
Megmondom a frankót lesz erről később egy iromány (mármint a generikusokról), de most csak az egyszerü paraméteres osztályokról szeretnék beszélni.
Szóval vegyünk például egy egyszerű osztályt, amit később szeretnénk több paraméterrel is használni. Igazából most nem tudtam nagyon életszerü példát felhozni, ezért csak ilyen lolka-bolka kódot írtam össze.
/**
* Ez az osztály képviseli példánkban
* a paraméteres osztályt, ahol <T>
* fogja jelenteni az aktuális paramétert.
* Hót egyszerü osztály, két függvénnyel,
* és egy privát változóval, mely szintén
* a paraméteres típus tagja.*/
class SimpleParam<T> {
/**
* Alap konstruktor, ahol
* paraméterben megadunk egy T típusú
* változót.
*/
public SimpleParam(T value) {
this.i = value; // Átadjuk az értéket.
}
/**
* Beállítjuk i értékét.
* @param value i új értéke.
*/
public void setI(T value) {
this.i = value;
}
/**
* Visszakapjuk i értékét.
* @return i.
*/
public T getI() { return i; }
// Az egyszem változónk.
private T i;
}
// Fő osztályunk, ahol kipróbáljuk a paraméteres osztályt.
public class Parameterized {
public static void main(String... argv) {
SimpleParam<String> sp1 = new SimpleParam<String>("Hello World!"); System.out.println(sp1.getI()); // Érték kiiratása sp1.setI("Goodbye world!"); // Érték megváltoztatása. System.out.println(sp1.getI()); // Érték kiiratása.
SimpleParam<Integer> sp2 = new SimpleParam<Integer>(5); System.out.println(sp2.getI()); // Érték kiiratása. sp2.setI(123); // Érték megváltoztatása. System.out.println(sp2.getI()); // Érték kiiratása.
}
}
Hasonlóan a paraméterezett ArrayList-hez, ezt az osztályt is példányosíthatom bármilyen referencia típussal.
Mivel ebben az osztályban csak egy módosító és egy hozzáférő metódus van, így attól sem kell tartani, hogy bármelyik objektumállapotban hibás működést fogok kapni. Erre azért oda kell figyelni.
Ha bárhol utánaolvastok a régi 'legacy' kódokban használt nyers típusokat nem ajánlják sehol, így ezeket érdemes elkerülni. ( pl. ArrayList al = new ArrayList(); )
Külön tanulmányok foglalkoznak azzal, hogy hogyan lehet régi kódot vegyíteni új, paraméteres, vagy generikus kóddal.
Update 1.: Rosszul fogalmaztam az előbbiekben, ez a kód is generikus, csak ezt szokták paraméterezett-nek is hívni. Az ArrayList analógiájára.
Update 2.: Fordításkor az összes ilyen generikus típus információ törlésre kerül, és a program nyers típusokra fordul le a generikusok esetén. Tehát kedvenc ArrayList<String>ünkből lesz egy sima ArrayList.
Viszont a kód fordítási időben garantálja, hogy csak a megfelelő típus kerülhet a kódunkba. ;-)