Jauninājumi programmēšanas valodas Java 1.5 versijā
Man parādījās mazliet brīvāks laiks, tādēļ nolēmu izmantot
early access iespēju un mazliet paspēlēties ar nākamo Java 1.5.
UzstādīšanaIelādēju failu un atpakoju to vēlamajā direktorijā. Tad, atbilstoši dokumentācija, uzstādīju vides mainīgos:
export JSR14DISTR=`pwd`
export J2SE14=/usr/local/j2sdk1.4.2
export PATH=`pwd`/scripts:$PATHUn pārliecinājos, ka tiks izmantoti jaunie faili (
which javac; which java). Piefiksēju, ka, lai kompilētu Java 1.5 specifisko kodu, kompilatoram jānorāda atslēga "-source 1.5", respektīvi:
java -source 1.5 ManaKlase.javaNu un tad paši jauninājumi:
Static import piedāvā importēt klases statiskos locekļus (atribūtus un metodes). Tas ļauj atteikties no klases nosaukuma rakstīšanas metodes izsaukumā. Izņemot īsāku pierakstu, ir grūti iedomāties, kas būs ieguvēji no šī jauninājuma. Koda lasāmību tas neuzlabos. Vai tiešām valodā bija nepieciešams ieviest jaunu sintaktisku konstrukciju, lai par vienu vārdu (un punktu) saīsinātu metodes izsauku?
Tātad turpmāk
System.out.println("Hello world!");varēs aizstāt ar
import static java.lang.System.*;
out.println("Hello world!");Generics ļaus izmantot kaut ko līdzīgu C++ veidņu (
template) konstrukcijai, lai nodrošinātu tipu drošību kompilēšanas laikā. Neiedziļinoties visos sīkumos un ierobežojumos, manuprāt, visnoderīgākais no visiem jauninājumiem. Galvenais ieguvums -- zūd nepieciešamība pārveidot tipu (
cast).
Izmantojot Java 1.4, var uzrakstīt sekojošu kodu:
Vector v = new Vector();
v.add("Viens");
v.add("Divi");
v.add(new Integer("3"));Un rezultātā var iegūt
ClassCastException, kad trešo vektora elementu pārveido uz
String tipu. Java 1.5 tā vietā piedāvā sekojošu kodu:
Vector<String> v = new Vector<String>();
v.add("Viens");
v.add("Divi");
v.add(new Integer("3")); // kompilācijas kļūdaforeach cikls ir jauna
for cikla konstrukcija. Vienkāršāk nodemonstrēt, nekā aprakstīt. Tātad, turpinot iepriekšējo piemēru, Java 1.4 variants:
for (Iterator i = v.iterator(); i.hasNext();)
System.out.println((String)i.next());Un Java 1.5 variants:
for (String s : v)
System.out.println(s);Angliski šo ciklu varētu aprakstīt kā "
for each String in Vector". Dīvainākais ir tas, ka jauninājuma autori neieviesa jaunu atslēgvārdu, bet gan piedāvā ":" lasīt kā "in". Tas esot bijis nepieciešams, lai ļautu kompilēt vecākus izejas tekstus, kuros "in" ir izmantots kā mainīgā nosaukums. Vai bija vērts bojāt valodu, lai izvairītos no vienkāršas
search-replace problēmas?
Vēl viena problēma, ko es šeit saskatu, ir valodas sintakses atkarība no bibliotēkām. Respektīvi: jaunā sintakse pieprasa, lai mainīgais
v (skat. piemēru) realizētu
java.lang.Iterable interfeisu un pats risinājums balstās uz
java.lang.SimpleIterator interfeisu. Šāda atkarība jau ir vērojama darbā ar izņēmumiem (
throws,
throw,
catch), kas pieprasa, lai izņēmums būtu
java.lang.Throwable apakšklase. Problēma nē, bet drīzāk neveiksmīgs risinājums, vismaz manā skatījumā. Man gribētos, lai valodas sintakse un bibliotēkas būtu pilnīgi neatkarīgas.
Pārskaitījumi ir veca "sāpe" programmēšanas valodā Java. Jaunajā Java versijā pārskaitījumi tiek realizēti ar identisku sintaksi kā C/C++, bet nodrošina arī tipu drošību un ļauj pat definēt tajos metodes. Kādēļ ir nepieciešamas metodes, man nav skaidrs, bet pārskaitījumu ieviešana ir ļoti pozitīvs jauninājums.
Vienkāršākais definēšanas piemērs:
enum Number { One, Two, Three };Un šīs definīcijas izmantošana programmā:
Number i = Number. One;
switch (i) {
case Number.One:
case Number.Two:
case Number.Three:
default:
}Autoboxing/unboxing veic automātisku konvertāciju starp primitīvajiem tipiem un to
wrapper klasēm:
int un
Integer,
long un
Long, utt. Dotajā piemērā primitīvais tips
int automātiski tiek pārveidots par
Integer:
public void setCount(Integer count) { this.count = count; }
...
setCount(3);Varargs galvenokārt ir pazīstami no C bibliotēkas funkcijas
printf(). Tātad –- iespēja nodot metodei mainīgu skaitu parametru. Programmēšanas valodā Java šie parametri tiek nodoti kā noteikta tipa un nosaukuma masīvs, pretstatā C, kur darbam ar parametriem jāizmanto funkcijas.
public void print(Object ... args) {
System.out.println("Number of arguments: " + args.length);
for (Object o : args)
System.out.println(o);
}
...
print(1, 2, "Trīs");
Dažas piezīmesAngliskojumus izmantoju, jo atbilstošus latviskojumus nezinu.
Star imports ir slikti, es tos izmantoju tikai piemēra pēc.
for ciklam es iteratorus vispār cenšos neizmantot, piemēros tie tiek izmantoti, lai parādītu ekvivalentas kontrukcijas. Visi jauninājumi netika apskatīti, jo, piemēram, metadati kompilatorā vēl nav realizēti.
Manam
Vim redaktoram vajadzēs jaunu sintakses failu.