[Java lista] elvi kerdes: protected adattag

istvan.ketler at lhsystems.com istvan.ketler at lhsystems.com
2009. Okt. 8., Cs, 09:18:36 CEST


Szia,

Jó kérdés. Ha protected helyett accessor metódusok vannak, akkor könnyen megvalósítható az adatellenőrzés. Protected adattag esetén erre nincs lehetőség. Példa: az osztályom kezeli a barátnők listáját, de csak azokat a lányokat akarom felvenni ide, akiknek barna a szeme. Ha az adattárolásra használt lista protected láthatóságú, akkor a leszármazott osztályt semmi nem kényszeríti erre a konvencióra, és elkezdi felvinni a kék szemű lányokat is. Ettől az ajándékvásárló metódusom elromlik, mert nincs felkészülve az eltérő szemszínre, és inkompatibilis színű ajándékokat kezd vásárolni - ergo összeveszés prognosztizálható a barátnővel. Ha nem protected láthatóságú a lista, akkor a getter visszatér egy unmutable listával, a setter pedig átmásoláskor ellenőrzi a konvenciót, és be nem tartása esetén goromba kivétellel reagál.

Norbival ellentétben pont akkor látom hasznát a protectednek, ha a fő célom az, hogy az adott package más osztályai is közvetlenül elérjék az adattagot, és a leszármazottakra is értelmes lenne ezt kiterjeszteni. Ha van egy osztályom, aminek egyetlen célja a GUI widget-ek inicializálása, és ez példányosításkor azonnal megtörténik, akkor esetleg lehet haszna a közvetlen elérésnek. Többé-kevésbé mindegy persze, hogy közvetlenül kapom meg a widget-et, vagy getter segítségével. Ennek mintegy mellékhatása lesz, hogy a leszármazott is látja ezeket - sőt, ügyesen használva akár ki is bővíthetem az egyes widget-ek lehetőségeit (pl. lecserélem egy button action-jét, és az új action hívja meg a régit, miközben valami mást is elvégez).

Protected lehet még az adattag akkor is, ha az ősosztály kifejezetten azt akarja, hogy a leszármazottak használják az adott funkcionalitást. A Swing esetén ilyen például a listenerList; persze ez is elérhető lenne accessorral, de a cél ugye az, hogy csak a leszármazott láthassa, így a publikus getter/setter kicsukva. A protected accessor pedig ilyen esetben egy kicsit butaság - ezt a listát nem lehet rosszul használni, hiszen ez csak egy objektum referencia, amely objektum kikényszeríti a saját metódusain keresztül a konvenciókat. Most nagyképűen ki lehetne jelenteni, hogy alapszabályként akkor legyen protected az adattag, ha az accessor metódusai közül egyiknek sem lenne protected-nél bővebb a láthatósága - de ez nem biztos, hogy mindig igaz lenne. (Fejlesztés alatt álló bonyolult osztályban olyat is láttam már, hogy a saját privát változót is getterrel érte el - és milyen jól jött ez, amikor valamit módosítani kellett, és elég volt a getterben elvégezni a trükköt.) Lazy inicializálás esetén is hasznos lehet akár a privát getter is - ha még nincs, inicializálja, és így adja vissza.

El tudom képzelni a protected hasznát akkor is, ha primitív adattípusú adattagok láthatóságát állítom be így (ugye esetükben a getteren kívül kötelezően setter is kellene, míg referencia típus esetén nem feltétlenül). Ennek akkor lehet értelme, ha sokat használják ezeket a változókat a csomag többi tagjai, és a leszármazottak is várhatóan sokat fogják használni (pl. sok paraméteres bonyolult képletek, egyenletek megoldásánál - mondjuk ilyenkor használj inkább Fortrant, de ez most egy másik vita.)

Ésszerű lehet akkor is, ha egy abstract osztály mindenfélét csinálhat az adott változóval, de várhatóan ezt a változót a definiálandó metódusoknak is használniuk kell majd. Ilyenkor a fő cél ugye az, hogy minél kényelmesebben legyen elérhető az adattag.

Most hirtelen ennyi jut eszembe, de biztos másra is jó lehet.

Üdvözlettel,

Iván

István Ketler

Lufthansa Systems Hungaria Kft. 
Airline Management Solutions 
Schedule & Revenue Management 
Alkotás u. 53.
1123 Budapest
Hungary 

Tel: +36 1 887-2815 
Fax: +36 1 887-2977 

Room: MOM Park, Building A, Room 556 

e-mail: istvan.ketler at lhsystems.com 
Internet: www.LHsystems.hu


 
Sitz der Gesellschaft / Corporate Headquarters: Lufthansa Systems Hungaria Kft, Budapest, Fövarosi Birosag 01-09-463417
Geschaeftsfuehrung / Management Board: Monika Houck

-----Original Message-----

From: javalist-bounces at javagrund.hu [mailto:javalist-bounces at javagrund.hu] On Behalf Of zamek
Sent: Thursday, October 08, 2009 7:17 AM
To: javalist at javagrund.hu
Subject: [Java lista] elvi kerdes: protected adattag

hello,

Egy kollegam aki java-t tanit tette fel a kerdest, annak apropojabol, 
hogy egy hallgatojat nem tudta meggyozni arrol, hogy az ososztalyban 
deklaralt adattagokat ne protected-kent deklaralja, hanem private-kent 
es csinaljon hozza getter/setter metodusokat.

A kerdes az volt, hogy tudok-e peldat arra, amikor szukseg lehet arra, 
hogy egy osztaly adattagjai protected-kent legyenek deklaralva?

En nem igazan tudtam ra okot. Ti tudtok?

-- 
 thx,
----------------------------------
Zoltan Zidarics programmer
PTE-PMMFK H-7621 Pecs, Boszorkany u. 2. Hungary
E-Mail: zamek at vili.pmmf.hu
----------------------------------
      

_______________________________________________
Javalist mailing list
Javalist at javagrund.hu
http://javagrund.hu/mailman/listinfo/javalist


További információk a(z) Javalist levelezőlistáról