{"id":60,"date":"2014-02-18T20:06:26","date_gmt":"2014-02-18T19:06:26","guid":{"rendered":""},"modified":"2018-09-17T21:54:29","modified_gmt":"2018-09-17T19:54:29","slug":"java-se-7","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/java-se-7\/","title":{"rendered":"Java SE 7"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/asd54s.png\" alt=\"Obr\u00e1zok\" width=\"200\" height=\"134\" \/>28.6.2011, po piatich rokoch v\u00fdvoja bola zverejnen\u00e1 nov\u00e1 verzia Java Standarnd Edition, verzia 7. V kr\u00e1kom \u010dl\u00e1nku sa teraz spolu pozrieme na to, ak\u00e9 najzauj\u00edmavej\u0161ie novinky priniesla.<!--more--><!--break--><\/p>\n<p>Kompletn\u00fd zoznam zmien mo\u017eete n\u00e1js\u0165 na ofici\u00e1lnej str\u00e1nke Oraclu tu. Z toho, \u010do tam n\u00e1jdete, som sa ja rozhodol vybra\u0165 tieto t\u00e9my: projekt Coin, nov\u00e9 java.nio API a Fork\/Join framework.<\/p>\n<p><strong>Projekt Coin<\/strong><\/p>\n<p>Cie\u013eom tohto projektu bolo umo\u017eni\u0165 \u013eu\u010fom navrhn\u00fa\u0165 r\u00f4zne drobn\u00e9 (n\u00e1zov bol vybran\u00fd pr\u00e1ve kv\u00f4li zd\u00f4razneniu tej drobnosti) vylep\u0161enia jazyka, ktor\u00e9 by im umo\u017enili jednoduch\u0161ie ka\u017edodenn\u00e9 pou\u017e\u00edvanie. Nakoniec sa ich vyzbieralo pribli\u017ene 70 a z nich boli realizovan\u00e9 tieto:<\/p>\n<ol>\n<li><em>String ako parameter switch <\/em>\u2013 po novom je mo\u017en\u00e9 pou\u017e\u00edva\u0165 v kon\u0161trukcii Switch aj typ String a na z\u00e1klade neho n\u00e1js\u0165 spr\u00e1vnu vetvu. Nezabudnite samostatne otestova\u0165, \u010di re\u0165azec nie je null, inak to sp\u00f4sob\u00ed v\u00fdnimku.<\/li>\n<li><em><span style=\"font-weight: normal;\">Vylep\u0161en\u00e1 <\/span><\/em><em><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">syntax<\/span><\/span><\/em><em><span style=\"font-weight: normal;\"> \u010d\u00edsel<\/span><\/em><span style=\"font-weight: normal;\"> \u2013 do \u010d\u00edseln\u00fdch kon\u0161t<\/span><span style=\"font-weight: normal;\">\u00e1<\/span><span style=\"font-weight: normal;\">nt je po novom mo\u017en\u00e9 zapisova\u0165 znak <\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">podtr\u017e<\/span><\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">n<\/span><\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">\u00edka<\/span><\/span><span style=\"font-weight: normal;\"> \u201e_\u201c. Tak\u017ee \u010d\u00edslo <\/span><em><span style=\"font-weight: normal;\">1000<\/span><\/em><span style=\"font-weight: normal;\"> m\u00f4\u017eete zap\u00edsa\u0165 ako <\/span><em><span style=\"font-weight: normal;\">1_000<\/span><\/em><span style=\"font-weight: normal;\">. Je to \u010diste z\u00e1le\u017eitos\u0165 syntaxe a na samotn\u00fa hodnotu nem\u00e1 \u017eiaden vplyv.<\/span><\/li>\n<li><em><span style=\"font-weight: normal;\">Bin\u00e1rne hodnoty<\/span><\/em><span style=\"font-weight: normal;\"> \u2013 do primit\u00edvnych \u010d\u00edseln\u00fdch typov je mo\u017en\u00e9 po novom uklada\u0165 \u010d\u00edsla v bin\u00e1rnom form\u00e1te. Teda, napr.: i<\/span><em><span style=\"font-weight: normal;\">nt x = 0x1010101<\/span><\/em><\/li>\n<li><em>Multicatch<\/em> \u2013 jeden catch blok je mo\u017en\u00e9 pou\u017ei\u0165 na odchyt\u00e1vanie r\u00f4znych v\u00fdnimiek.<\/li>\n<li><em>Try-with-resources<\/em> \u2013 ak m\u00e1te objekt, ktor\u00fd implementuje rozhranie AutoClosable (po novom je od neho odvoden\u00e9 Closable), tak viete pou\u017ei\u0165 nov\u00fd try <span style=\"background: transparent;\">kon\u0161trukt<\/span>, ktor\u00fd za v\u00e1s automaticky objekt zatvor\u00ed v pr\u00edpade norm\u00e1lneho ukon\u010denia, ale aj v pr\u00edpade v\u00fdnimky.<\/li>\n<li><em>Diamantov\u00fd oper\u00e1tor<\/em> (\u0161kared\u0161\u00edm n\u00e1zvom <em>Improved Type Inference for Generic Instance Creation<\/em>) &#8211; parameter generick\u00e9ho typu pri definovan\u00ed premennej je mo\u017en\u00e9 po novom odvodi\u0165 z \u013eavej strany priradenia. Inak povedan\u00e9, je mo\u017en\u00e9 zap\u00edsa\u0165 toto:<em>Map&lt;Integer, Map&lt;String, String&gt;&gt; map = new HashMap&lt;&gt;(); <\/em><\/li>\n<li><em>Nov\u00e9 varovanie o vararg generickom <\/em><em><span style=\"background: transparent;\">paramet<\/span><\/em><em><span style=\"background: transparent;\">ry<\/span><\/em> \u2013 Java nem\u00e1 rada polia generick\u00fdch typov. Ak pou\u017eijete vararg parameter s generick\u00fdm typom, tak vo vn\u00fatri sa vytvor\u00ed pr\u00e1ve tak\u00e9 pole. V predch\u00e1dzaj\u00facej verzii dostal varovanie len ten, kto tak\u00fa met\u00f3du volal. Po novom aj ten, kto ju vytvoril.<\/li>\n<\/ol>\n<p><strong>Nov\u00e9 java.nio API (NIO 2)<\/strong><\/p>\n<p>Java SE 7 prin\u00e1\u0161a u\u017e tretiu gener\u00e1ciu API pre pr\u00e1cu so s\u00faborov\u00fdmi syst\u00e9mami, <span style=\"background: transparent;\">ktor\u00e9<\/span> by malo zjednodu\u0161i\u0165 pou\u017e\u00edvanie a vyrie\u0161i\u0165 niektor\u00e9 probl\u00e9my. So \u201es\u00faborov\u00fdmi syst\u00e9mami\u201c som nap\u00edsal naschv\u00e1l, preto\u017ee jednou z nov\u00fdch vlastnost\u00ed je to, \u017ee je mo\u017en\u00e9 vytvori\u0165 <em>Provider<\/em> triedu pre \u013eubovo\u013en\u00fd hierarchick\u00fd syst\u00e9m, a takto s n\u00edm pracova\u0165 ako so \u0161tandardn\u00fdm s\u00faborov\u00fdm. Distrib\u00facia Javy v sebe obsahuje tak\u00fdto provider pre klasick\u00fd s\u00faborov\u00fd syst\u00e9m, a tie\u017e pre ZIP s\u00fabory (teda pracujem s obsahom ZIP s\u00faboru ako s norm\u00e1lnym s\u00faborov\u00fdm syst\u00e9mom).<\/p>\n<p>Z\u00e1kladom cel\u00e9ho API je trieda <em>Path<\/em>. T\u00e1 reprezentuje cestu k objektu, pri\u010dom cesta v tomto momente e\u0161te nemus\u00ed existova\u0165. Na manipul\u00e1ciu sa pou\u017e\u00edvaj\u00fa statick\u00e9 met\u00f3dy triedy <em>Files<\/em>. Pribudli met\u00f3dy, ktor\u00e9 umo\u017e\u0148uju r\u00fdchly z\u00e1pis a <span style=\"background: transparent;\">\u010d\u00edtanie zo s\u00faboru <\/span><span style=\"background: transparent;\">v r\u00e1mci<\/span><span style=\"background: transparent;\"> nieko\u013ek\u00fdch riadkov<\/span> bez nutnosti pracova\u0165 so streamami a pod.<\/p>\n<p>\u010eal\u0161ie vylep\u0161enia predstavuje jednoduch\u00e9 vyh\u013ead\u00e1vanie v r\u00e1mci adres\u00e1ra alebo celej adres\u00e1rovej \u0161trukt\u00fary, podpora liniek alebo atrib\u00fatov s\u00faborov pre konkr\u00e9tny typ opera\u010dn\u00e9ho syst\u00e9mu (napr. POSIX opera\u010dn\u00fd syst\u00e9m).<\/p>\n<p><em><span style=\"font-weight: normal;\">N<\/span><\/em><span style=\"font-weight: normal;\"> v n\u00e1zve znamen\u00e1 nonblocking, a to znamen\u00e1 asynchr\u00f3nne programovanie. Cie\u013eom bolo umo\u017eni\u0165 programu pokra\u010dova\u0165 vo vykon\u00e1van\u00ed aj v \u010dase, kedy e\u0161te prebieha oper\u00e1cia so s\u00faborov\u00fdm syst\u00e9mom. Nov\u00e9 API podporuje dva tak\u00e9to asynchr\u00f3nne modely: <\/span><em><span style=\"text-decoration: none;\"><span style=\"font-weight: normal;\">future<\/span><\/span><\/em><span style=\"font-weight: normal;\"> a <\/span><em><span style=\"font-weight: normal;\">callback<\/span><\/em><span style=\"font-weight: normal;\">. Ten prv\u00fd by ste mali pou\u017ei\u0165 vtedy, ak nepotrebujete zareagova\u0165 okam\u017eite na skon\u010denie IO oper\u00e1cie, ale v pravidlen\u00fdch intervaloch budete preru\u0161ova\u0165 in\u00fa \u010dinnos\u0165 a kontrolova\u0165 jej v\u00fdsledok. Ten druh\u00fd by ste mali pou\u017e\u00ed\u0165 pr\u00e1ve v t\u00fdch pr\u00edpadoch, kedy potrebujete zareagova\u0165 okam\u017eite na ukon\u010denie IO oper\u00e1cie.<\/span><\/p>\n<p><strong>Fork\/Join Framework<\/strong><\/p>\n<p><span style=\"font-weight: normal;\">Ide o nov\u00fa implement\u00e1ciu rozhrania <\/span><em><span style=\"font-weight: normal;\">Executor<\/span><\/em><span style=\"font-weight: normal;\">, ktor\u00e1 vo vn\u00fatri pou\u017e\u00edva <\/span><em><span style=\"font-weight: normal;\">steal work<\/span><\/em><span style=\"font-weight: normal;\"> algoritmus. Z\u00e1kladn\u00fd princ\u00edp tohto algoritmu je, \u017ee pr\u00e1cu rozdel\u00ed medzi nieko\u013eko vl\u00e1kien, ktor\u00e9 pracuj\u00fa paral<\/span><span style=\"font-weight: normal;\">e<\/span><span style=\"font-weight: normal;\">lne. Ka\u017ed\u00e9 vl\u00e1kno m\u00e1 svoj vlastn\u00fd z\u00e1sobn\u00edk, z ktor\u00e9ho si pr\u00e1cu berie, ale pred <\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">jej vykonan\u00edm sa e\u0161te rozhoduje, \u010di u\u017e m\u00e1 dostato\u010dn<\/span><\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">e<\/span><\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\"> mal<\/span><\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">\u00fd<\/span><\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\"> k\u00fasok na <\/span><\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">to, aby sa pustil do spracovani<\/span><\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">a<\/span><\/span><span style=\"font-weight: normal;\">alebo nie<\/span><span style=\"font-weight: normal;\">. Ak nie, tak si pr\u00e1cu rozdel\u00ed na dve \u010dasti, ulo\u017e\u00ed ich na vrch z\u00e1sobn\u00edka, op\u00e4\u0165 vyberie najvy\u0161\u0161iu \u010das\u0165 a znova vykon\u00e1 rozhodnutie. Takto sa pre ka\u017ed\u00e9 vl\u00e1kno vytv\u00e1ra z\u00e1sobn\u00edk, kde v dolnej \u010dasti s\u00fa najv\u00e4\u010d\u0161ie kusy a v hornej najmen\u0161ie. Kradnutie pr\u00e1ce m\u00e1 tento algorimus v n\u00e1zve preto, lebo ak sa niektor\u00e9mu vl\u00e1knu minie v\u0161etka pr\u00e1ca, tak sa m\u00f4\u017ee pozrie\u0165 do z\u00e1sobn\u00edka in\u00e9ho vl\u00e1kna a z jeho dolnej \u010dasti jeden diel ukradn\u00fa\u0165. Ke\u010f\u017ee paral<\/span><span style=\"font-weight: normal;\">e<\/span><span style=\"font-weight: normal;\">ln<\/span><span style=\"font-weight: normal;\">\u00e9<\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">algoritmy s\u00fa len tak dobr<\/span><\/span><span style=\"font-weight: normal;\"><span style=\"background: transparent;\">\u00e9<\/span><\/span><span style=\"font-weight: normal;\">, ko\u013eko je v nich synchroniz\u00e1cie, je snaha, aby jej bolo najmenej. Pr\u00e1ve pri tomto kradnut\u00ed prebieha nejak\u00e1 synchroniz\u00e1cia medzi prv\u00fdm a druh\u00fdm vl\u00e1knom, a aby jej bolo najmenej, je algoritmus navrhnut\u00fd tak, aby druh<\/span><span style=\"font-weight: normal;\">\u00e9<\/span><span style=\"font-weight: normal;\"> vl\u00e1kno ukradlo zo z\u00e1sobn\u00edka \u010do najv\u00e4\u010d\u0161\u00ed kus pr\u00e1ce. A ten je &#8230; pr\u00e1ve v dolnej \u010dasti z\u00e1sobn\u00edka.<\/span><\/p>\n<p>Je samozrejme, \u017ee podobne ako pri map-reduce, aj v tomto pr\u00edpade sa potom v\u00fdsledky jednotliv\u00fdch algoritmov zbieraj\u00fa a nakoniec sp\u00e1jaj\u00fa do jedn\u00e9ho vysledku (reduce).<\/p>\n<p>Okrem t\u00fdchto spomenut\u00fdch vec\u00ed, Java 7 priniesla aj mnoho drobn\u00fdch vylep\u0161en\u00ed v r\u00f4znych oblastiach. Za zmienku stoj\u00ed zaj\u00edmav\u00fd fakt, a to \u017ee do\u0161lo k oddeleniu \u0161pecifik\u00e1cie jazyka javy (<em>JLS<\/em>) a \u0161pecifik\u00e1vie virtu\u00e1lneho stroja (<em>VMspec<\/em>). Hlavne v tom smere, \u017ee VMspec sa u\u017e nijako neodkazuje na Javu ako jazyk. Je to nepochybne len \u010fal\u0161\u00ed krok v iniciat\u00edve, ktor\u00e1 je jasn\u00e1 u\u017e nieko\u013eko rokov a to, \u017ee z Java Runtime sa st\u00e1va multiplatforma, ktor\u00e1 dok\u00e1\u017ee vstreba\u0165 r\u00f4zne jazyky s r\u00f4znymi vlastnos\u0165ami.<\/p>","protected":false},"excerpt":{"rendered":"<p>28.6.2011, po piatich rokoch v\u00fdvoja bola zverejnen\u00e1 nov\u00e1 verzia Java Standarnd Edition, verzia 7. V kr\u00e1kom \u010dl\u00e1nku sa teraz spolu pozrieme na to, ak\u00e9 najzauj\u00edmavej\u0161ie novinky priniesla.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-60","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/60","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=60"}],"version-history":[{"count":1,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/60\/revisions"}],"predecessor-version":[{"id":176,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/60\/revisions\/176"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=60"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=60"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=60"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}