Gyakorlati alapok II.
Érték és cím szerinti paraméterátadás
A címben lévő fogalmak megértéséhez először olvassuk el az Ezt sajnos most kell tisztáznunk: mutató és referencia című fejezetet.
Az objektumorientált nyelvek egyik legfontosabb jellegzetessége, hogy a programfunkciók szétoszthatók, megoszthatók a metódusok között (tegyük hozzá: (az objektumorientált alapelvből következően ez kötelező is). Ennek sokféle követelménye van, az egyikük az, hogy a metódusok bemeneti adatokat, paramétereket kaphatnak, amit aztán belső programjuk szerint kimeneti adatokká alakítanak át (ez a return utasítás utáni érték).
Érték szerinti paraméterátadás
Eddig nem volt feltűnő, sőt a Java-nyelvben szinte alapértelmezésnek vettük, hiszen ez a logikus, hogy a bemeneti adatok, paraméterek azok a kiindulópontok, ahonnan a metódus elkezdi működését, hogy aztán megfelelő kimeneti adatokat kapjunk. Ehhez csupán az kellett, amit egyébként a Java alkotói biztonsági szempontból szintén észrevettek-, hogy a bemeneti adatokat senki és semmi se tudja megváltoztatni.
A Java nyelv így is tesz: a metódus bemeneti adatait semmi sem tudja megváltoztatni, legfőképpen nem maga a metódus. Az ilyen jellegű paraméterátadást érték szerinti paraméterátadásnak nevezzük. Technikailag nézve ez kizárólag referenciákkal történik.
Cím szerinti paraméterátadás
Ha a Java nyelvben működne a memóriacímképző & operátor, akkor (elméletileg) egy dedikált memóriaterület közvetlenül elérhetővé, ezáltal a benne tárolt tartalom módosíthatóvá válna.
Ezt a fajta paraméterátadást cím szerinti paraméterátadásnak nevezzük. Talán legfőbb jellegzetessége, hogy a bemeneti paraméterként kapott változót maga a metódus is képes megváltoztatni.
Ilyen példát a Java nyelvben nem tudunk megmutatni, ezért más programozási nyelvekhez kell fordulnunk. Dr. Czirkos Zoltán honlapja szerint (www.eet.bme.hu/~czirkos/) a C++ nyelv vezette be a cím szerinti paraméterátadást. Az alábbi kód alapja onnan származik (Referenciák című fejezet):
void szamol(int a, int b, int& osszeg, int& szorzat) {
osszeg = a + b;
szorzat = a * b;
}
int o, sz;
szamol(5, 9, o, sz);
A Java nyelvben jártasak a kódot minimum szokatlannak minősíthetik, hiszen jól látható, ahogy a metódus bemeneti paraméterlistája direkt memóriacímzéssel kimeneti adatokat is tartalmaz. Memóriacímek közvetlen címzése és ilyetén használata még nyilvánvaló veszélyei ellenére is mindenképpen praktikus és előnyös, bár igen távol áll a Javában elvárt és megszokott programozási szabványoktól.