Gyakorlati alapok
Különutas véletlenszám-generálás
A Véletlenül generáljunk már véletlenszámokat! című fejezetben sokféle "véletlenszerű" Java-kód fordul elő. Ezekből egyet kiválasztva most azt nézzük meg, hogy miképpen lehet a benne foglaltakat külön metódusban is megvalósítani. Legyen a feladat 10 db 1 és 100 közé eső int típusú véletlenszám külön függvényes generálása! A kód tároló-kiindulópontja egy 10 elemű int[]tombFeltoltott nevű tömb, ezt lesz feltöltve véletlenszámokkal:
import java.util.Random;
public class Main {
static int[]veletlenSzamgenerator(){
int[]tombFeltoltott = new int[10];
Random random = new Random();
for(int i = 0; i < tombFeltoltott.length; i++){
tombFeltoltott[i] =
random.nextInt(100) + 1;
}
return tombFeltoltott;
}
public static void main(String[] args) {
int tombAtvevo[] = new int [10];
for(int i = 0; i < tombAtvevo.length;
i++){
System.out.print(tombAtvevo[i] + "
");
}
}
}
Végeredmény:
0 0 0 0 0 0 0 0 0 0
A végeredmény mégis 0 értékek tömege, aminek oka, hogy nem teremtettünk kapcsolatot a külső metódus és a main() tömbje közt, más szóval nem vettük át a külső metódus által generált értékeket. Ehhez csak 1 sort kell beillesztenünk a megfelelő helyre:
tombAtvevo = veletlenSzamgenerator();
Ám vegyük észre, hogy előzőleg alaposan beállítottuk a kimeneti és bemeneti adattípus-egyezéseket: lényegében mindkettőnek azonos típusúnak kell lennie (int[10]), másként sokféle hibaüzenettel szembesülhetünk.
import java.util.Random;
public class Main {
static int[]veletlenSzamgenerator(){
int[]tombFeltoltott = new int[10];
Random random = new Random();
for(int i = 0; i < tombFeltoltott.length; i++){
tombFeltoltott[i] =
random.nextInt(100) + 1;
}
return tombFeltoltott;
}
public static void main(String[] args) {
int tombAtvevo[] = new int [10];
tombAtvevo = veletlenSzamgenerator();
for(int i = 0; i < tombAtvevo.length; i++){
System.out.print(tombAtvevo[i] + "
");
}
}
}
Végeredmény (például):
27 81 56 23 44 56 96 65 56 24
A kódfutás azért működött azonnal, mert a külső metódus static módosítószóval volt illetett; erről részletesen írtam az Alapszinten a static módosítóról című fejezetben. Ha azonban önhatalmúlag, diktatorikus módon megfosztjuk tőle, hibaüzenetet kapunk: a fordító JVM lényegében nem ismeri fel a veletlenSzamgenerator() függvényre történő hivatkozást. E mögött egy egyszerű hozzáférési szabály húzódik meg:
Statikus változók és metódusok nem férhetnek hozzá NEM statikus változókhoz, metódusokhoz. Viszont NEM statikus változók és metódusok hozzáférhetnek statikus változókhoz, metódusokhoz, hiszen éppen ez a statikusság fő előnye.
A megoldás már említett módon a példányosítás:
Main main = new Main();
Ezután már hozzáférhetünk a Main osztály összes (egyéb módon nem korlátozott) metódusához, ezt az példányosított név + pont (.) hivatkozással tehetjük meg (itt main.):
tombAtvevo = main.veletlenSzamgenerator();
import java.util.Random;
public class Main {
static int[]veletlenSzamgenerator(){
int[]tombFeltoltott = new int[10];
Random random = new Random();
for(int i = 0; i < tombFeltoltott.length; i++){
tombFeltoltott[i] =
random.nextInt(100) + 1;
}
return tombFeltoltott;
}
public static void main(String[] args) {
int tombAtvevo[] = new int[10];
Main main = new Main();
tombAtvevo = main.veletlenSzamgenerator();
for(int i = 0; i < tombAtvevo.length; i++){
System.out.print(tombAtvevo[i] + "
");
}
}
}
Végeredmény (például):
76 46 4 43 10 18 46 3 79 66