the other side ([info]ukawi) rakstīja [info]koderi kopienā,
@ 2003-09-25 00:54:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
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īšana
Ielā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:$PATH


Un 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.java

Nu 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ļūda


foreach 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īmes
Angliskojumus 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.


(Ierakstīt jaunu komentāru)


[info]skalpelis
2003-09-25 01:04 (saite)
Atsit paitonu.
Nē, nopietni, paitona specenē ir kaut kas šausmīgi līdzīgs.

Tas import static ir identisks paitonam, vienīgi paitonā nav vārdiņš static; for arī ir tāds pat.
Mainīgs parametru skaits funkcijām arī bija iespējams.

Nēnu, droši vien jau ka tikai sakritība.

(Atbildēt uz šo) (Diskusija)


[info]smejmoon
2003-09-29 22:26 (saite)
jython

(Atbildēt uz šo) (Iepriekšējais)


[info]watt
2003-09-25 13:00 (saite)
pousts, žournāls, tagad vēl paitons...

vienkārši pitonu!

(Atbildēt uz šo) (Diskusija)


[info]skalpelis
2003-09-25 13:47 (saite)
puksts, žurnāls un pitons

(Atbildēt uz šo) (Iepriekšējais)


Neesi iežurnalējies. Iežurnalēties?