Scurte despre Java (5)
Câteva articole bune despre noţiuni din Java:
Cuprinzătoare mai e grădina Java-ului!
S(O)CJP la preţ de “fabrică”
Nu mică mi-a fost mirarea când am aflat azi de la un prieten că certificarea SCJP mai nou costă 599 RON, fără TVA. Eu ştiam că tocmai ce a modificat Oracle preţurile la toate examenele la valoarea unică de 300 USD. Şi atunci am văzut pagina asta (am pus şi screenshot pentru că dacă ai IP din afara României vezi 300 USD acolo, în loc de RON 599):
Dacă daţi click pe Register, de sub preţ, veţi ajunge pe siteul prometric.com unde veţi afla, după ce selectaţi ţara si examenul, că examenul costă 300 USD. Buuuun, mi-am zis, hai să sun la un centru de testare. Am sunat la primul din listă, Centrul de Pregatire in Informatica de pe Averescu. Aici mi s-a spus că dacă iau voucherul de pe prometric.com mă costa 300 USD, dacă îl iau direct de la ei este 400 USD, deci nici vorbă de 599 RON.
Mă întorc la siteul Oracle şi sun la numărul de contact din România: +4021 3678820. Aici aflu că situaţia stă în felul următor: ca să puteţi da examenul la preţul acela trebuie să contactaţi Oracle Ro, ori la telefonul respectiv, ori la emailul emea-cc-ops_ww@oracle.com şi să cereţi un formular. Am primit formularul şi vă ataşez mai jos conţinutul emailului primit:
Buna ziua,
La Oracle examenele se sustin in fiecare zi de joi incepand cu ora 17:00, la sediul din Calea Floreasca 169A, Cladirea Floreasca Business Park, etaj 1.
Va trimit atasat formularul de inscriere, pe care va rugam sa ni-l transmiteti completat, semnat si stampilat (daca e cazul) in 2 exemplare originale. Pentru operativitate va rugam sa ne transmiteti mai intai o copie prin fax (021 312 69 79) sau scanat prin e-mail (education_ro@oracle.com). Va rugam sa completati toate campurile in format electronic si sa-l tipariti - nu se accepta formularele incomplete si/sau completate de mana.
Daca sustineti examenul in calitate de persoana fizica, plata trebuie efectuata in avans, prin transfer bancar in contul mentionat pe formular sau cash la RBS Bank. Daca platiti cash la RBS Bank aveti nevoie de o factura proforma - pe care o putem face pe baza formularului. Pentru inscriere va rugam sa ne transmiteti si o copie dupa dovada platii.Mai jos gasiti pasii de creare a unui nou cont de examen pe noul furnizor PearsonVue. Fara detaliile acestui cont nu puteti sustine examenul. Daca aveti deja un cont nu trebuie sa mai faceti nimic.
Pretul pe site este fara TVA. Cand efectuati plata va rog sa luati in calcul si TVA-ul.
Daca aveti nevoie de detalii suplimentare va rog nu ezitati sa ma contactati.
Multumesc
Before arriving for your Oracle Certification Program exam appointment at the OTC, please follow the steps below to confirm or create your Pearson Vue web account at least 72 hours before your appointment time.
Existing users should proceed to pearsonvue.com and log in with your username and password. If you are a new user, and have not logged in to pearsonvue.com before, you will follow the steps below to set up your web username and password at least 72 hours before your appointment time.
1.Go to www.pearsonvue.com/oracle
2.Click on test taker services
3.Select Oracle
4.Select My Account
5.Click on create a new web account: It is important that you enter your profile and contact information on the next screens as you think it exists in your Oracle profile as the system will perform an automated matching process that will match the record you are creating up with the record that was uploaded from Oracle.
a.Create your profile>Next
b.Enter contact information>Next
c.An automatic matching process occurs.If Pearson Vue is able to determine that the information matches, you will be taken to the next screen to create a username.
6.Create a username and password
7.If Pearson VUE was unable to match your demographic data you will not be allowed to immediately create a username and password. However, Pearson VUE will look at your request and resolve the discrepancy. You will be contacted via your email address with the resolution. Since the resolution isn't immediate, it is important that you begin this process at least 72 hours prior to your appointment time.
Cred că include cam toate informaţiile utile, zic eu. Vă anunţ în scurt timp dacă acest proces pentru a da această certificare şi funcţionează.
Oricum, shame on you, Oracle, nu aşa ar trebui să procedeze o astfel de companie!
Ciudățenii cu colecții și generice
Sunt multe "lucrușoare" din Java pe care chiar și cei care programează zilnic în Java nu le (mai) știu și mai ales pentru că nu le folosesc. Pentru asta există cărțile de Java, să ne mai aducă aminte de multe astfel de secrete. Recunosc, spre rușinea mea, că nu am folosit până în prezent prea mult (în mod voit) avantajele polimorfismului, cel puțin în cazul apelurilor de metode.
Și astfel ajungem la subiect. Eu nu știam sau nu mi-am pus niciodată problema că ceea ce pot face astfel cu vectori:
public class PoliArrayExample {
public static void main(String[] args) {
Integer[] ints = new Integer[3];
Arrays arrs = new Arrays();
arrs.doSomethingWithArrays(ints);
}
}
class Arrays {
public void doSomethingWithArrays(Object[] arr) {
arr[0] = new String("test");
}
}
cu colecții nu este posibil, mai exact acest lucru nu se poate face:
public class PoliArrayExample {
public static void main(String[] args) {
ArrayList<Integer> ints = new ArrayList<Integer>();
Arrays arrs = new Arrays();
arrs.doSomethingWithArrays(ints);
}
}
class Arrays {
public void doSomethingWithArrays(ArrayList<Object> arr) {
arr.add("");
}
}
Se pare că în cazul colecțiilor în momentul în care semnătura metodei public void doSomethingWithArrays(ArrayList<Object> arr) va arăta astfel, nu vom putea apela decât cu un ArrayList de tip Object, fără subclase sau superclase (nu că Object ar avea super clase, dar putem extrapola). Prin urmare, în codul anterior vom avea probleme la linia 5. Acest lucru poate fi oarecum păcălit:
public class PoliArrayExample {
public static void main(String[] args) {
ArrayList<Integer> ints = new ArrayList<Integer>();
Arrays arrs = new Arrays();
arrs.doSomethingWithArrays(ints);
}
}
class Arrays {
public void doSomethingWithArrays(ArrayList<? extends Object> arr) {
arr.add("");
}
}
spunându-i compilatorului să accepte și clase care au extins sau implementat clasa/interfața de după extends, cu condiția să nu adăugam nimic în colecția primită ca și parametru. Astfel, nu scăpăm, primind o eroare de compilare la linia 11, spunându-ne că nu există metoda add cu parametru de tip String. Putem folosi șmecheria de mai sus, atât timp cât nu adăugăm în acea colecție nimic. Și așa cum cu extends am permis accesul subclaselor, cu super putem permite accesul superclaselor:
public class PoliArrayExample {
public static void main(String[] args) {
ArrayList<Object> ints = new ArrayList<Object>();
Arrays arrs = new Arrays();
arrs.doSomethingWithArrays(ints);
}
}
class Arrays {
public void doSomethingWithArrays(ArrayList<? super Integer> arr) {
arr.add(new Integer(1));
}
}
Și în acest caz nu vom avea nicio problemă să și adăugăm elemente în colecție, atât timp cât sunt de tipul specificat sau subclase ale tipului specificat. (mulțumesc Ducu pentru corectură!)
Toate acestea se întâmplă datorită modului în care au fost implementate genericele în Java. Cei care au făcut genericele în Java au dorit ca odată cu apariția genericelor să poată fi folosit și codul de dinainte de Java 5 și generice. Prin urmare, genericele sunt doar la nivel de compilator și la runtime un obiect de tip List<String> devine un simplu obiect List și Java nu mai are niciun control asupra ceea ce pui în lista respectivă. La vectori treaba stă altfel și un String[] chiar și la runtime tot String[] rămâne și când vom încerca să adăugăm altceva decât tipul permis vom primi o excepție (ArrayStoreException).
Scurte pentru SCJP
În questul iniţiatic de pregătire pentru susţinerea examenului de certificare SCJP 6, am întâłnit tot felul de noţiuni pe care nu le ştiam/foloseam, unele utile, altele nu (din punctul meu de vedere) şi am zis să le înşir undeva în funcţie de cum am chef să fac asta!
Şi ce loc mai bun decât blogul personal? Iată o serie din ele:
- metoda Object.finalize() marchează obiectul că-l poate lua garbage collectorul, când va crede de cuviinţă Măria sa! Evident este o metodă de instanţă, am expus-o astfel pentru a fi mai scurt in exprimare;
- diferenţa dintre StringBuilder şi StringBuffer este că StringBuffer este thread-safe, adică are metodele synchronized şi din cauza asta metodele lui vor rula mai greu, deci dacă nu aveţi o aplicaţie multi-thread, folosiţi StringBuilder;
- putem folosi clasa Scanner pentru a face nişte splituri ceva mai şmechere. Clasa are ca separator implicit spaţiu " " şi cu ajutorul metodelor nextXxx() putem sări la următorul token de tipul Xxx (prin token se înţelege informaţia utilă splituită de separator);
- dacă încercăm să compilăm un cod în care serializăm o clasă care nu a implementat interfaţa Serializable sau are un atribut care nu este primitivă şi nu a implementat interfaţa Serializable, ne vom trezi cu excepţie;
- dacă încercăm să serializăm o clasă care implementează interfaţa Serializable dar extinde o clasă neserializabilă, la deserializarea clasei se va apela constructorul super clasei extinsă de clasa serializată;
- putem folosi modificatorul transient pentru a marca o variabilă să nu fie serializată; la deserializare ea va fi iniţializată cu valoarea implicită pentru acel tip;
- există interfeţe "marker", adică nu au niciun fel de metode; acestea sunt folosite ca nişte etichete aplicate clasei ce le implementează, pentru a scoate în evidenţă nişte capacităţi ale acelei clase;
Vor mai urma...
Java EE 6 bătut în cuie
Ieri a fost aprobată specificaţia finală de Java EE 6. Aşteptăm cu interes implementarea (mai ales de la Jboss).
Curs scris online de EJB3
În feed-urile urmărite în dimineața asta am dat de cursul ăsta de EJB3. Ce are special? Mi-a placut că este un curs practic care constă în construirea unor aplicații pornindu-se de la niște cerințe concrete. Suportul din partea autorului scade gradual în construirea aplicațiilor. Este interesant că oferă o abordare completă a soluției aplicațiilor, pornind de la diagrame UML, arhitectură și cod.
Este inclusă și o carte electronică gratuită, “Mastering Enterprise JavaBeans 3.0”, ca suport teoretic. Soluțiile complete (proiecte Netbeans) sunt oferite de autor. La o primă vedere, mi se pare un curs util și o abordare care te invață prin practică.
Java EE: despre interceptori
Citind cartea despre care v-am vorbit într-un articol anterior, am descoperit niște clase despre care nu mai auzisem până acum: interceptorii.
Prezentarea lor începe cu o scurtă introducere despre AOP, noțiune nouă pentru mine. După cum am înțeles, AOP înseamnă să “decorezi” logică refolosibilă, în general, cu diferite funcționalități, fără aduce modificări asupra logicii menționate. De exemplu, AOP ar putea fi transformarea ușoară a unui Session Bean într-un web service sau într-un RESTful service.
În Java EE “aspectele” sunt numite interceptori. Un interceptor este o clasă cu o metodă adnotată și are controlul complet asupra execuției unei metode. Un interceptor este “atașat” unei clase cu ajutorul adnotării @Interceptors({interceptori}). Între acolade este o listă de clase de interceptori.
Iata un exemplu scurt de interceptor:
1: public class InterceptorDeTest {
2:
3: @AroundInvoke
4: public Object interceptM(InvocationContext ic) {
5:
6: //fă ceva
7: return ic.proceed();
8: }
9: }
Și o clasă care are atașat un interceptor:
1: @Stateless
2: @Interceptors({InterceptorDeTest.class})
3: public class ClasaDeTest{
4: public String helloWorld() {
5: return "HelloWorld!";
6: }
7: }
În momentul în care este apelată metoda helloWorld firul execuției va trece mai întâi prin interceptor. Acesta execută prelucrările sale și apelează metoda proceed() care are ca efect trecerea la executarea codului următorului interceptor din listă, dacă există, sau a metodei interceptate (în cazul nostru, metoda helloWorld()).
Interceptorii pot fi folosiți pentru diferite inițializări sau validări înainte sau după execuția unei metode. În cartea lui Adam Bien e și un exemplu cu interceptori în care se pot redenumi firele de execuție a unei aplicații în funcție de metoda pe care o execută, pentru o mai bună observare într-un profiler sau într-un dump, scăpând astfel de numele random și lipsite de înțeles date firelor de execuție.
PS: Un articol general despre utilizarea interceptorilor și cel cu redenumirea thread-urilor.
Recomandări JavaEE
Am dat de curând peste blogul unui tip care a făcut o serie de articole despre JPA și diferite implementări ale lui. Conținutul articolelor vine din experiența acestui domn, ceea ce înseamnă că sunt pline de lucruri învățate “the hard way”, care nu le găsiți scrise în manuale sau cărți “obișnuite” de JavaEE. Unele din aceste soluții le-am aflat și eu încercând să rezolv diferite excepții de care dădeam, dar nu înțelesesem foarte bine de ce se întâmplă ceea ce se întâmplă.
De asemenea mi-am luat (adică am cumpărat-o
) o carte foarte interesantă care mi-a atras atenția pentru că tratează subiectul în același stil ca și blogul de mai sus, dar mult mai pe larg. Deocamdată doar am răsfoit-o, revin cu mai multe impresii mai târziu.
Scala
Este unul din limbajele de programare promovate mai intens în ultima perioadă ce rulează pe mașina virtuală Java. Scala promite cod mai inteligibil și surse mai mici față de Java și un strop de programare funcțională. Părerea mea e că seamănă destul de tare cu Ruby, de altfel n-ar fi primul limbaj/framework adus în lumea Java ce aduce a Ruby & Rails (vezi Groovy & Grails).
Un articol ce face o scurtă comparație între Scala și Java găsiți aici.
Schimbări de limbaj în Java 7, propuse de proiectul Coin
Proiectul Coin este unul din proiectele desfășurate cu ajutorul comunității Java pentru a îmbunătăți limbajul. Lista de propuneri a proiectului Coin ce va fi implementată în noua versiune este finală și aprobată. Cele 5 (sau mai multe) îmbunătățiri propuse de Coin și ajunse în lista finală sunt:
- Posibilitatea de a folosi String-uri în switch;
- Management automat de resurse;
- Instanțare îmbunătățită a tipurilor cu generice;
- Invocare a metodelor cu aritate variabilă simplificată;
- Suport pentru literale binare și posibilitatea de a include “underscores” în numerele foarte lungi, pentru a fi mai ușor de citit;
- Suport îmbunătățit pentru colecții;
- Suport pentru JSR 292.

