Interacțiunea între module
Adesea, dezvoltatorii definesc nu unul, ci mai multe module care sunt utilizate în program. Iar atunci când modulele interacționează între ele, există anumite particularități de care trebuie să ținem cont. Să analizăm cum pot modulele să interacționeze între ele.
Vom defini un proiect cu următoarea structură:
Interacțiunea modulelor în Java 9
Aici sunt definite două module: demo și operations.
În folderul operations/com/fdc/factorial este definit următorul fișier Factorial.java:
package com.fdc.factorial;
public class Factorial{
public static int calculate(int n){
if (n < 0) return -1;
int result = 1;
for(int i =1; i <= n; i++){
result = result * i;
}
return result;
}
}
Clasa Factorial definește o funcție pentru calculul factorialului și aparține pachetului com.fdc.factorial.
Să presupunem că dorim ca această clasă să fie utilizată în alte module. Dar, în mod implicit, toate pachetele unui modul sunt invizibile pentru modulele din exterior. Pentru a face vizibil un pachet definit într-un modul pentru alte module, acest pachet trebuie exportat folosind operatorul exports la definirea modulului.
Pentru aceasta, în folderul operations este definit următorul fișier module-info.java:
module operations {
exports com.fdc.factorial;
}
Fișierul specifică faptul că acest modul se va numi operations. Cu ajutorul operatorului exports este exportat pachetul com.fdc.factorial. Astfel, alte module vor putea utiliza clasa Factorial.
Acum trecem la modulul demo. În folderul demo este definit următorul fișier module-info.java:
module demo {
requires operations;
}
Prin operatorul requires indicăm faptul că modulul demo va utiliza modulul operations.
În folderul demo/com/fdc/hello/ definim următorul fișier Hello.java:
package com.fdc.hello;
import com.fdc.factorial.Factorial;
public class Hello {
public static void main(String[] args) {
int a = 5;
int b = Factorial.calculate(a);
System.out.printf("Factorial of %d is equal to %d \n", a, b);
}
}
Aici importăm clasa Factorial din pachetul com.fdc.factorial și calculăm factorialul unui număr.
Compilăm primul modul - operations:
javac -d appmodules/operations operations/module-info.java operations/com/fdc/factorial/Factorial.java
Prin parametrul -d indicăm că modulul compilat va fi plasat în directorul appmodules/operations (dacă acest director nu există, va fi creat automat).
Compilăm al doilea modul - demo, care utilizează primul modul:
javac -p appmodules -d appmodules/demo demo/module-info.java demo/com/fdc/hello/Hello.java
Parametrul -p este o prescurtare pentru --module-path și indică unde să caute modulele utilizate. În acest caz, este folderul appmodules, unde anterior a fost plasat modulul compilat operations.
Parametrul -d, la fel ca în cazul anterior, indică unde va fi plasat modulul compilat - în folderul appmodules/demo.
După ce totul este compilat, rulăm modulul demo:
java -p appmodules -m demo/com.fdc.hello.Hello
La compilare, prin parametrul -p se specifică folderul în care se află ambele module compilate. În final, pe consolă va fi afișat factorialul unui număr:
