Laborator FIS 4

Mediul de dezvoltare NetBeans

NetBeans este un mediu integrat de dezvoltare Java, care ofera foarte multe facilitati. Pentru acest laborator a fost ales NetBeans (versiunea 7) fiindca include si un modul de dezvoltare vizuala a interfetelor grafice, modul ce va fi utilizat ulterior. In continuare vom detalia modul de realizare a mai multor activitati, folosind NetBeans:

Pentru a se crea un nou proiect, de la meniul "File -> New Project...", se selecteaza categoria "Java" si tipul proiectului "Java Application" (daca s-ar fi selectat "Java Desktop Application", s-ar fi creat o aplicatie vizuala, care deschide o fereastra). Dupa ce se apasa pe "Next", va apare o fereastra in care se va specifica numele proiectului si unde anume va fi pe disc. In acest director, va fi creat un subdirector cu numele proiectului, subdirector in care se vor afla directoarele specifice diverselor componente din proiect. Daca dorim sa generam si o functie "main", atunci se va completa numele acesteia in "Create Main Class". In fata acesteia, separat prin ".", se poate pune un nume de package pentru proiect. "Set Main Project" inseamna ca toate comenzile implicite, gen "Run", "Debug", etc...vor actiona asupra acestui proiect. Dupa ce s-au completat aceste campuri si s-a apasat "Finish", NetBeans va crea un cadru de proiect si il va deschide:

Central este fisierul pe care il editam. In stanga se afla managerul de proiect (Projects), de unde putem selecta orice fisier din proiect, adauga clase noi, sterge, redenumi, schimba proprietati de proiect, etc. Sub acesta se afla navigatorul (Navigator)- o fereastra de unde putem sa ajungem imediat la definitia unei clase, metode, atribut, etc. In partea de jos se afla statusul curent (Tasks). Aici apar mesajele de sistem, erorile, atentionarile, etc. Facand dublu clic pe acestea, ajungem la locul lor in codul sursa. Acum apare un mesaj TODO care ne anunta ca avem de implementat codul unei metode. Tot in partea de jos apare si fereastra de Output, care se activeaza cand rulam programul si in care se vad rezultatele executiei acestuia.

Pentru editarea codului NetBeans furnizeaza syntax highlighting (colorarea specifica a diverselor sectiuni/cuvinte), code autocompletion (daca scriem un identificator si apasam Ctrl-Space ne va apare o lista de optiuni de completare automata a acelui cuvant si totodata, daca punem un ".", ni se ofera lista de membri de unde putem alege), code navigation (cu clic dreapta pe un cuvant, "Navigate->Goto Source" (sau direct apasand pe tasta data), putem ajunge la locul de definire a acelui cuvant), refactorization (cu clic dreapta, "Refactor->Rename") pe un cuvant putem sa-l redenumim in toate locurile in care apare in proiect, etc.

In managerul de proiect (fereastra Projects), putem (cu clic dreapta) adauga clase sau fisiere noi, modifica denumiri, sterge fisiere din proiect, muta un fisier in alt package, deschide fisiere pentru editare, schimba proprietatile proiectului, etc. Tot aici, daca un fisier sursa contine erori, vom fi atentionati vizual printr-un mic semn de exclamare rosu, atasat acelui fisier. Pentru exemplul nostru, vom mai creea inca 2 fisiere, Shape.java si Circle.java. Crearea se face automat, cu click dreapta pe package-ul unde vrem sa le cream (fis.lab4), "New->Java Class" si completand numele lor. Dupa ce acestea vor fi create, vom face clasa Circle sa extinda Shape (de exemplu, daca dupa numele clasei scriem "s" si apasam Ctrl-Space - automat va apare cuvantul "extends", iar daca dupa asta mai apasam odata pe Ctrl-Space, va apare o lista de clase de unde putem selecta clasa de baza).

In clasa Shape vom adauga o noua metoda: "public abstract void draw();". Dupa adaugarea acesteia, vom remarca in stanga numelui clasei Shape in mesaj de eroare, pe care daca ne pozitionam cu mouseul, apare mesajul de eroare in clar. Totodata acest mesaj apare si in fereastra Tasks. In cazul nostru, din cauza ca metoda draw este abstracta, si clasa Shape trebuie sa fie abstracta. NetBeans poate el sa corecteze aceasta problema si daca apasam pe iconul de eroare din stanga numelui clasei, ni se prezinta sugestia de a face class Shape abstracta, sugestie pe care o vom selecta. In fereastra Tasks, pentru a se vedea noul status al unui fisier, trebuie prima oara sa salvam acel fisier.

Daca ne vom intoarce acum la clasa Circle, vom constata si aici ca a aparut o eroare, pe care NetBeans o poate solutiona automat: Circle fiind derivata dintr-o clasa abstracta, trebuie sa fie ori abstracta ori sa implementeze toate metodele abstracte. Selectam iconul de eroare din stanga numelui si folosim sugestia "Implement all abstract methods". Automat in class Circle va apare implementarea metodei draw din Shape. Totodata, in clasa Circle dorim sa rescriem metoda toString din Object, pentru ca atunci cand afisam un cerc la consola sa apara un mesaj formatat inteligibil. Pentru aceasta NetBeans ne pune la dispozitie optiunea "Insert Code", din meniul contextual care apare cand facem clic dreapta in editor. La "Insert Code" vom selecta metoda toString. In aceasta situatie NetBeans stie ca toString are o functie mai speciala, si ne propune sa selectam ce campuri vom dori sa le afisam. Le lasam pe toate selectate, si apasam "Generate". In final codul pentru Circle va arata cam asa:

Mesajul de TODO a disparut fiindca in Main am facut urmatoarele modificari:

package fis.lab4;

public class Main{

public static void show(Object o){System.out.println(o.toString());}

public static void main(String[] args) {

show("hi");

}

}

Daca dorim acum sa cream un cerc si sa-l afisam, vom scrie urmatorul cod (in metoda main):

public static void main(String[] args) {

show("hi");

Circle c=null;

c.x=100;

c.y=200;

c.r=50;

show(c);

}

In NetBeans putem rula un program de la meniul "Run->Run Main Project" sau direct cu tasta F11. La rulare se deschide fereastra Output, in care apare mesajul "hi" si dupa el o exceptie de tip null pointer. Daca apasam pe link-ul asociat cu ea, ajungem la linia "c.x=100;". In cazul nostru sa presupunem ca nu stim de ce a aparut aceasta eroare si dorim sa rulam programul pas cu pas, pentru a vedea ce se petrece. Pentru aceasta, vom folosi Debugger-ul integrat in NetBeans. Inainte de a porni debuggerul, vom seta un Breakpoint pe linia "c.x=100;", cu clic dreapta si "Toggle Line Breakpoint". Vom vedea cum linia devine caramizie si in dreapta ei apare un mic patrat tot caramiziu. Daca cumva am pus breakpointul pe alta linie, ii mai putem da odata "toggle" ca sa dispara, si il punem unde dorim. Breakpointuri se pot pune si facand clic pe bara din stanga codului. Breakpointurile reprezinta puncte in care, daca rulam programul in debugger, executia se suspenda automat pentru a putea inspecta codul. Putem avea oricate breakpointuri. Dupa ce l-am setat, selectem "Debug -> Debug Main Project". Vom remarca schimbarea in NetBeans cand ruleaza debuggerul:

Cu verde apare linia care urmeaza sa se execute. Fereastra Variables contine variabile pe care NetBeans le-a ales automat sa le afiseze, dar putem sa ne adaugam si noi propriile noastre variabile. In acelasi timp, daca miscam mouseul peste un simbol (in acest caz mouseul este peste "c"), va apare o fereastra cu valoarea acelui simbol. In bara de sus mai apar niste butoane, incepand cu butonul patrat rosu cu un alt patrat mai mic in el. Aceste butoane au urmatoarele actiuni:

    • Finish Debugger Session - opreste executia programului din debugger si revine la modul obisnuit de editare

    • Pause - daca se executa o rutina mai lunga, putem suspenda programul, pentru a inspecta diverse atribute ale sale

    • Continue - continua programul pana la urmatorul breakpoint sau pana la terminare

    • Step Over - avanseaza executia programului la urmatoarea linie, fara a se intra in subrutine, daca pe linia curenta se afla un apel de metoda

    • Step Over Expression - avanseaza executia programului peste o intreaga expresie, fara a se intra in constructori, functii, etc

    • Step Into - daca pe linia curenta se afla un apel de metoda (sau constructor), va continua executia intrand in acea metoda

    • Step Out - daca suntem intr-o metoda, executa tot codul din metoda, pana cand se iese din ea

In cazul nostru constatam ca eroarea a aparut din cauza ca c este null, asa ca vom opri debuggerul si vom inlocui linia "Circle c=null;" cu linia ""Circle c=new Circle();" (dupa new (si spatiu) putem apasa pe Ctrl-Space pentru a fi ajutati sa scriem mai repede codul). La urmatoarea rulare ("Run" sau F11), vom constata ca programul ruleaza corect.

La fel cum in C fisierul final pentru un program este un fisier .exe (in Windows), care poate fi executat in mod direct, in Java, cand vom livra programul beneficiarului, trebuie sa cream un fisier .jar, care va contine toata aplicatia si pe care il vom putea distribui. Pentru a se crea acest fisier, in fereastra Projects facem clic dreapta pe numele proiectului (Exemplu) si selectam optiunea "Clean and Build". Aceasta va crea in subdirectorul "dist" din directorul aplictiei un fisier "Exemplu.jar", care va contine toata aplicatia. Acest fisier poate fi rulat cu dublu clic, sau din linie de comanda cu "java -jar Exemplu.jar" dar, din cauza ca dupa afisare consola dispare imediat, nu vom vedea pe ecrat niciun rezultat. Pentru a vedea un rezultat, trebuie sa-l rulam de la "Command Prompt" cu comanda "java -jar Exemplu.jar" (schimband prima oara directorul in directorul "dist"). Pentru aplicatiile grafice, se poate rula direct fisierul jar, aparand pe ecran fereastra aplicatiei.

JavaDoc

JavaDoc este un sistem de documentare a codului, folosind texte inserate direct in textul sursa, sub forma de comentarii, care au un format special. Daca in fereastra Projects, facem clic dreapta pe numele proiectului si selectam "Generate Javadoc", in subdirectorul dist/javadoc vor fi generate mai multe fisiere html (care formeaza un mic site), cu documentatia pentru codul sursa. Pentru a le vedea, trebuie sa deschidem fisierul "index.html" intr-un browser:

Dupa cum putem vedea, au fost generate automat documentatii pentru toate package-urile, clasele si membrii lor. pentru a adauga descrieri specifice la documentatia generata, JavaDoc foloseste comentarii care incep cu /** (doua asteriscuri) si care se termina normal, cu */ (pe langa aceste asteriscuri, mai pot fi adaugate oricate altele, pentru o formatare frumoasa in codul sursa). Pentru a comenta cu membru, comentariul se pune in fata (deasupra) acelui membru. Prima linie de text reprezinta o descriere scurta, care apare in lista de membrii ai clasei respective, dupa care urmeaza o linie goala si urmeaza o descriere lunga, care apare cand selectam specific in documentatie acel membru (descrierea lunga poate sa nu fie data), iar apoi se afla o lista de "taguri" (indicatii de formatare), cu proprietati speciale. Vom completa toate comentariile JavaDoc in fisierul Circle.java (la care s-a adaugat si metoda set), dupa cum urmeaza:

package fis.lab4;

/**

Un cerc, definit prin coordonatele centrului si prin raza.

*/

public class Circle extends Shape{

/**

Coordonata x a centrului cercului.

*/

public double x;

/**

Coordonata y a centrului cercului.

*/

public double y;

/**

Raza cercului.

*/

public double r;

/**

Seteaza valorile cercului, corespunzatoare parametrilor dati.

Aceasta metoda poate fi apelata <b>oricand</b>,

pentru a seta noi valori atributelor cercului.

@param x coordonata x a centrului cercului

@param y coordonata y a centrului cercului

@param r raza cercului

* */

public void set(double x,double y,double r)

{

this.x=x;this.y=y;this.r=r;

}

/**

Implementeaza metoda abstracta {@link Shape#draw()}

pentru a desena un cerc.

@see Shape#draw()

* */

@Override

public void draw() {

throw new UnsupportedOperationException("Not supported yet.");

}

/**

Formateaza sub forma de String cercul.

@return un String care reprezinta textual cercul

* */

@Override

public String toString() {

return "Circle{" + "x=" + x + ", y=" + y + ", r=" + r + '}';

}

}

Explicatii:

    • ca o conventie, descrierile scurta si lunga incep cu litera mare, pot sa aiba oricate propozitii si se termina cu ".". Daca o descriere nu incape pe un rand, se poate scrie pe mai multe randuri succesive, in documentatia generata aparand ca si cand ar fi fost scris in continuare

    • in documentatia generata, descrierea scurta si lunga la detaliile membrului apar una dupa cealalalta, pe acelasi rand

    • se pot folosi taguri html (de exemplu <b>, <i>, <ul>, <table>, ....) pentru formatari speciale, deoarece textul final este html

    • in texte se pot intercala linkuri catre alti membri, folosind sintaxa {@link Shape#draw()}. Linkurile in JavaDoc se scriu sub forma urmatoare: package.class#member(arguments). Daca membrul se afla in acelasi package sau class, acestea pot sa lipseasca. Lista de argumente este necesara pentru a se distinge intre mai multi membri cu acelasi nume.

    • tagurile JavaDoc incep cu "@", dupa care urmeaza numele tagului si optional mai multe argumente, de exemplu:

    • @param nume descriere - explica parametrul de metoda avand numele nume

    • @return descriere - explica valoarea de return a metodei. La return este bine sa nu se inceapa cu formulari de genul "returneaza" sau "intoarce", pentru ca acestea sunt in plus.

    • @see link_la_membru - creaze un link la membrul respectiv (dat sub forma de link), pentru referinta.

Dupa ce s-au introdus aceste documentatii JavaDoc, se va regenera inca odata documentatia, observandu-se cum apar fiecare in documentatia generata. Pentru descrierea altor taguri care se pot folosi, precum si a optiunilor lor, se pot consulta urmatoarele materiale:

http://en.wikipedia.org/wiki/Javadoc

http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html

Site-ul NetBeans este: http://netbeans.org/