Elméleti alapozás
Az inicializálás I.
Amint az már több helyen említésre került, a számítógépnek egzakt, pontos, hiba nélkül értelmezhető bemeneti adatokra van szüksége számításainak elkezdéséhez.
A bemeneti adatok tárolásához mindenekelőtt műveleti memóriaterületeket kell lefoglalni. Ne ijedjünk meg: ez a JVM feladata. Ám azokat programozás-technikailag szabványos nevekkel el kell nevezni, valamint valamilyen kezdőértékkel fel is kell tölteni, hiszen nagyon veszélyes, ha mindezt a véletlenre bízzuk. Ezt az összetett folyamatot nevezzük incifincializálásnak, bocsánat inicializálásnak (initialization).
Mit nevezhetünk véletlennek a számítógép, ezen teljesen determinisztikus rendszer esetében?
Nos, tipikusan ilyen lehet minden előzőleg ottmaradt, "ottfelejtett" adat. Én már többször futottam ilyen jellegű hibába, amikor is nem figyeltem eléggé egy változó kezdeti vagy átmeneti értékeire és emiatt rossz kimeneti adatot kaptam. Egy tökéletesen értelmezhetetlen krix-krax -ha éppen nem eltérő karakterkódolás végeredménye-, sokszor előzőleg ottfelejtett, nem törölt adatselejt vagy egyéb adattörmelék megnyilvánulása.
Kanyarodjunk vissza a bemeneti adatok pontos létrehozásához!
Például körszámításokkal kapcsolatban garantáltan fel fog merülni a PI (a kör kerületének és átmérőjének hányadosa), amelyet minimum a sugárral (r) együtt szintén deklarálnunk kell. Először vegyük a PI változót:
final double PI = 3.1415926535;
Tehát ebben az esetben nemcsak létre kell hoznunk a PI változót, hanem:
-
meg kell határoznunk típusát,
-
programozás-technikailag szabványos módon el kell neveznünk,
-
fel kell töltenünk egy egzakt kezdeti értékkel,
-
illetve mivel most egy állandóról beszélünk, úgy kell deklarálnunk, hogy ne tudja semmi megváltoztatni (erre való a final módosítószó - Ami a változót (és a többieket) változatlanná teszi: a final című fejezet).
Körszámításokkal kapcsolatban fel fog még merülni a körsugár (r) értéke is. Hogyan inicializáljuk ezt a változót?
double r;
Van olyan programozási nyelv, amelyik ilyen vagy ehhez hasonló deklarációt megenged (bár ekkor a programozó magának okoz súlyos gondokat), de speciel a Java nem tűri a pontatlan inicializálást, így a kód erőltetett futtatásakor azonnal hibaüzenettel szembesülünk:
public class Main {
public static void main(String[] args){
double r;
System.out.println(r);
}
}
Végeredmény:
Exception in
thread "main" java.lang.Error: Unresolved compilation problem:
The local variable nev may not have been initialized at Main.main(Main.java:4)
A megoldás csakis a pontos és egzakt értékadás, érték-hozzárendelés lehet, ez elméletileg bármilyen, ebben az esetben double adattípus által elfogadható értéket jelent. Ha nincs konkrét kiindulási pontunk (például double r = 5.0), akkor a legpraktikusabb a numerikus változó 0-val inicializálása: double r = 0.
public class Main {
public static void main(String[] args){
double r = 0;
System.out.println(r);
}
}
Végeredmény:
0.0
A mai fejlesztői környezetek egyre magasabb szintű szoftver-automatikával támogatják a helyes inicializálási folyamatokat. Alább például egy tömb esetében láthatjuk, hogy az Eclipse a létrehozott tömb (int[] tomb = new int[5];) minden egyes elemét automatikusan 0 értékkel inicializálta:
public class Main {
public static void main(String[] args) {
int[] tomb = new int[5];
for(int i = 0; i < tomb.length; i++){
System.out.print(tomb[i] + " ");
}
}
}
Végeredmény:
0 0 0 0 0
Hasonlóan járhatunk el String adattípusok esetén. Lehetőségünk van tetszőleges kezdeti értékadásra...
public class Main {
public static void main(String[] args){
String st = "Java";
System.out.println(st);
}
}
Végeredmény:
Java
...vagy látszólag "üres", mégis korrekt értékadásra:
public class Main {
public static void main(String[] args){
String st = "";
System.out.println(st);
}
}
Végeredmény:
hiba nélkül lefutott, de üres konzol
A különböző adattípusok helyes inicializálási folyamataik részletesen ki vannak fejtve az adattípusok ismertető fejezeteiben, ezek:
A Java nyelv (egyszerű) adattípusai
A Java nyelv néhány összetett adattípusa
Összefoglalva: mindig ügyeljünk a változók a rendszer számára pontosan értelmezhető inicializálására. Ez néha, legtöbbször a kód elején lista hosszúságúvá terebélyesedhet, ám ezzel nem szabad takarékoskodnunk (sok esetben pedig nem is lehet).
Magasabb szinten, amikor már nem egyszerű változókat, hanem osztályokból létrehozott objektumokat hozunk létre (bár meg kell jegyeznem, hogy néhány összetett adattípus már hasonló inicializáló tulajdonságokkal rendelkezik), úgynevezett konstruktor függvényeket is bevethetünk, illetve számunkra ezeket a rendszer is dedikálhatja. Erről részletesen a Gyakorlati alapok III. (Az osztályok) című részben esik szó.