Most hogy végre véget értek vizsgáim, és ki tudtam szállni a mókuskerékből, gondoltam valami hasznos, de mégis könnyed témával folytatom. A statikusság egy elég hasznos dolog, ha azt szeretnénk, hogy programunk kicsit hatékonyabb legyen, vagy esetleg csak megakarjuk könnyíteni a saját életünket. Azt már mindenki tudja, hogy ha felveszünk egy adattagot egy osztályba, akkor példányosításnál létrejön minden példányhoz ez az adattag, tehát az osztályok egyes példányaihoz tartozik. A statikusság lényege abban rejlik, hogy a statikus változók/függvények magához osztályhoz tartoznak. Amikor példányosítunk, nem jön létre belőlünk egy „másolat”, csak egy darab létezik belőlük.

Statikus változókat használnak C++-ban például az ún. referenciaszámlálásra (ugyan kicsit kilépünk az ActionScript 3 problémaköréből, de ez a példa ideális, hogy megértsük a dolog lényegét). A refszámlálás lényege, hogy számon szeretnénk tartani az adott osztályunkból hány példány létezik jelen pillanatban. Ezt ugye egy statikus változóval nagyon egyszerűen megoldhatjuk (máshogy nem is igen lehetséges), hiszen csak annyi a dolgunk, hogy a konstruktorban növeljük (++staticvar), ill. a destruktorban csökkentsük (–staticvar). Megjegyzem, hogy sajnos ez az eljárás nem alkalmazható as-ben, mert nincs destruktorunk, maximum az összes példányosítás számát tudnánk ilyen módon nyomonkövetni.

Most nézzünk egy példát actionscript-ben. Tegyük fel, hogy nem létezik a math könyvtár, és nem tudjuk lekérdezni a Pi értékét, viszont gyakran számolunk vele a programunkba. Ezért létrehozunk egy statikus változót pi néven, minek hanyag módon csak a 2 tizedesjegyű 3,14-et adjuk értékül. Viszont innentől kezdve kényelmesen tudjuk használni, és nem kerül bele minden példányba feleslegesen.

Sajnos ez még nem egészen biztonságos, hiszen ezt az értéket lehetőségünk van még megváltoztatni, ami nem igazán lenne nyerő. Ilyen esetekben jön jól számunkra a konstans statikus változó. Actionscriptben Leggyakrabban így használatosak a statikus adattagok. Ennek leginkább az az oka, hogy ha véletlenül az egyik példányban megváltoztatjuk az értékét, akkor az az összes többi példányt érinti, hiszen ez a változó az osztályhoz tartozik. Persze mindig vannak kivételek, én például a hóesés effekt progiban, használok 2 static változót, amik nem konstansok. A két változó az ablak magasságát, ill. szélességét tartalmazza. Ezek a tulajdonságok miden hópehelynél megegyeznek, viszont nem akartam, hogy mind hordozza őket, felesleges. A konstansság pedig azért nem játszik, mert nem tudom, milyen értékkel fogják inicializálni, és inicializálólista híján nem tudunk konstansnak értéket adni, de deklaráláskor. Persze, emiatt a kis rugalmasságért cserébe számolni kell azzal az esettel, amikor valaki minden példányt más értékekkel veszünk fel, és ilyenkor statikus változó lévén mindig felülíródik, az össze példány tulajdonsága. Hát igen, bár ez a valóságban nem valószínű, de abban az esetben, ha hülyebiztos programot szeretnénk írni, akkor ilyen esetekre is gondolnunk kell.

Van még egy nagyon hasznos tulajdonsága az ilyen típusú változóknak. Ez a kód simán lefut azelőtt is, hogy létrehoznánk egy új objektumot:

var x:Number=className.pi;

Hiszen a pi nem egy példányváltozó, ezért bármikor lekérdezhetem az értékét. Az elérésszabályzókra azonban itt is figyelni kell. A fenti kód csak akkor lesz helyes, ha a pi definíciója ez:

public static const pi:Number  = 3.14;

Gondolom, ezek után nem árulok el nagy titkot, ha azt mondom, hogy a math könyvtár PI-je is így van megírva, azzal a különbséggel, hogy ott kicsit pontosabban ábrázolják az értékét (3.141592653589793).

Most ejtsünk néhány szót a statikus függvényekről. Ki lehet jelenteni, hogy használatuk nem olyan gyakori, mint fent említett társának, de szerepe ettől még igen fontos. Az elv ugyan az, létrehozunk egy függvényt, azzal a különbséggel, hogy az osztályunkhoz tartozik és nem egy adott objektumhoz. Ugyan úgy adhatunk neki visszatérésiértéket, paramétereket, és még természetesen az elérhetőségét is szabályozhatjuk. Viszont két dologban eltér átlagos társaitól:

  • Nem használhatjuk a this kulcsszót. gondoljunk bele, ez teljesen logikus, hisz nem egy objektum része.
  • Statikus függvény nem érheti el saját osztálya változóit, ill. függvényeit (fordítva természetesen semmi gond nincs).

És hogy hol használjuk ezeket? Vegyünk megint egy példát a math osztályból : abs(). Az abs függvény visszaadja egy szám abszolút értékét. Most nézzük, hogyan van definiálva:

public static function abs(val:Number):Number

Végeredményben egy teljesen hétköznapi függvényről beszélünk, azzal az eltéréssel, hogy ezt meghívhatjuk abban az esetben is, ha nincs ilyen objektumunk (adott esetben math).

var x:Number=math.abs(-2);

Mint láttuk érdemes használni a statikus változókat/függvényeket, mert megkönnyíthetik az életünket. Ezek után még annyit érdemes megjegyezni, hogy sok olyan osztály létezik melyekből soha nem jönnek létre példányok, csak és kizárólag statikus tagokkal dolgozik, jó példa az itt is annyiszor emlegetett math class.



Szólj hozzá a posthoz