JShell este o unealtă interactivă de tip „read-eval-print loop” (REPL) inclusă nativ în JDK-ul modern, concepută special pentru a scrie și testa rapid fragmente de cod Java fără a fi nevoie să creezi clase sau metode main. În practică, acest lucru elimină fricțiunea inițială de compilare și rulare, permițându-ți să validezi sintaxa, să explorezi API-uri noi sau să debughezi logică complexă în timp real. Pentru un dezvoltator care vrea să lucreze eficient, JShell devine un laborator personal unde poți experimenta cu librării terțe sau cu comportamentul claselor standard înainte de a integra codul în proiectul principal.
Concepte cheie
- Interacțiune instantanee: Introduci o expresie sau o declarație și primești rezultatul imediat, facilitând învățarea iterativă și testarea ipotezelor.
- Gestionarea variabilelor și metodelor: JShell păstrează starea sesiunii, permițând reutilizarea variabilelor declarate anterior și definirea de metode locale temporare.
- Comenzi interne: Utilizezi comenzi precum
/list,/editsau/resetpentru a gestiona sesiunea, vizualiza istoricul sau curăța spațiul de lucru. - Import automat: JShell importă automat pachetele comune (
java.lang,java.util), dar trebuie să specifici explicit importurile pentru alte librării. - Integrare IDE: Majoritatea editorilor moderne (IntelliJ IDEA, Eclipse) permit rularea JShell direct în interfață, oferind autocompletare și evidențiere a sintaxei.
- Exportul codului: Poți genera un fișier
.javadin sesiunea curentă folosind comanda/save, transformând experimentele în cod production-ready. - Contextul de execuție: Fiecare intrare este evaluată în contextul unei clase generate automat, ceea ce explică de ce nu ai nevoie de un
public static void main.
Exemplu practic
Imagină-ți că vrei să testezi rapid o expresie lambda pentru filtrarea unei liste, fără să scrii o clasă completă. În JShell, poți introduce direct:
List<String> names = Arrays.asList("Ana", "Ion", "Maria");
names.stream().filter(n -> n.startsWith("A")).collect(Collectors.toList());
Rezultatul va fi afișat imediat ca [Ana]. Dacă vrei să salvezi rezultatul într-o variabilă, poți scrie var filtered = .... Acest flux te ajută să înțelegi comportamentul stream-urilor și al colectoarelor fără overhead-ul unui proiect Maven sau Gradle. De asemenea, poți verifica tipul unei variabile folosind comanda /vars pentru a vedea inferența tipurilor făcută de compilator.
Greșeli frecvente
- Ignorarea erorilor de compilare: Dacă o linie are o eroare, JShell o marchează, dar continuă sesiunea. Trebuie să verifici întotdeauna mesajele de eroare înainte de a continua.
- Confuzia cu fișierele sursă: Variabilele definite în JShell nu persistă între sesiuni. Dacă închizi terminalul, pierzi tot contextul, spre deosebire de un fișier
.javasalvat. - Uitarea de semne de punct și virgulă: Spre deosebire de scripturile simple, JShell respectă regulile Java stricte; o expresie simplă nu necesită punct și virgulă, dar o declarație de variabilă da.
- Performanța la încărcare: Inițializarea JShell poate fi lentă dacă importi multe librării mari. Este recomandat să folosești doar dependențele necesare pentru testul respectiv.
Întrebări de interviu
De ce ar trebui să folosesc JShell în loc de un IDE clasic pentru prototyping? JShell oferă feedback instantaneu și reduce timpul de setup. Este ideal pentru validarea rapidă a unor concepte sau API-uri complexe fără a crea structura unui proiect.
Poți defini o metodă statică în JShell? Da, poți defini metode locale care sunt disponibile în sesiunea curentă, dar acestea nu pot fi apelate din afara JShell și nu fac parte dintr-o clasă persistentă.
Cum gestionezi dependențele externe în JShell?
Trebuie să adaugi calea classpath manual la pornirea JShell folosind flag-ul -cp sau -class-path, indicând către fișierele .jar necesare.
Exercițiu
Creează un script JShell care simulează un cont bancar simplu. Defineste o variabilă balans de tip double inițializată cu 1000.0. Scrie o metodă locală adaugaBani(double suma) care returnează noul balans și actualizează variabila globală. Testează metoda prin adăugarea a 500 și apoi scaderea a 200 folosind o altă metodă scadeBani(double suma). La final, folosește comanda /list pentru a vedea toate definițiile create și /vars pentru a verifica starea finală a balanței.