Demoštruje sa návratová hodnota skriptu new java.util.Date()
- čo to ale vôbec je? Volanie javovského kódu z javascriptu?
Zaujímavé by to bolo, keby fungoval prevod návratovej hodnoty v prípade javascriptového new Date()
. Výsledkom je totiž iba sun.org.mozilla.javascript.internal.NativeDate@1e893df
Ano, v JavaScriptovem kodu je mozne vytvaret javovske objekty, bud zpusobem naznacenym v demonstracnim prikladu, nebo je nutne na zacatku pomoci "funkce" importPackage() naimportovat prislusny balicek (skutecne se ze syntaktickeho hlediska jedna o JavaScriptovou funkci, ne o specialni konstrukci tak, jak to je v Jave).
To, zda new Date() vraci date, zavisi na pouzitem skriptovacim enginu, ale bylo by pekne, kdyby tech mapovani bylo vic.
Java objekty se daji ze skriptu (pri pouziti JSR 223) vytvaret a predavat do Javy, taky se da pomoci ScriptEngine.put() predat libovolny objekt s prirazenym klicem (String), to si ukazeme priste.
Volani libovolnych objektu ze skriptu (mysleno nepredane objekty) neni povoleno, aby script-kiddies meli trosku ztizenou praci :-)
Potom to znamena, ze to v Java skriptovani funguje rovnako ako vo Velocity.
Akeho nahradnika mate na mysli? Velocity som pouzival v diplomke, ale potom som zistil, ze Freemarker je v niektorych ohladoch lepsi, krajsia syntax a podobne (i ked Velocity odvtedy vstalo z mrtvych a zmenilo sa).
Ono realne je otazka, v akom pripade chcete vytvarat instancie objektov v skripte -- mal som konkretnu situaciu, ked som chcel skriptovat v XWiki (tam je povolene skriptovanie v Groovy a Velocity, ale v obmedzenych pripadoch len to druhe) a chcel som sa vyhnut vytvaraniu tried.
Myslim, ze snaha instanciovat objekty v sablonovom stroji je podozriva, kedze sa vam miesaju vrstvy.
Jen je zapotrebi dat si pozor na to, ktera metoda objektu se ve skutecnosti zavola a to kvuli tomu, ze nektere verze Rhina spatne rozeznavaji napriklad Integer a Double (vsechna cisla berou jako Double):
function accessJavaObject(object) { object.overloaded(new java.util.Date()); object.overloaded('Hello world'); object.overloaded(42); object.overloaded(1/3.0); };
V pripade, ze predany objekt ma napriklad metody overloaded(Date), overloaded(Integer) a overloaded(Double).
ze presto, ze ma Java oproti jinym jazykum/technologoiim konvence formatovani zdrojovych kodu http://www.oracle.com/technetwork/java/codeconvtoc-136057.html tak na to kaslete a formatujete jak se Vam libi.
Fujtajbl.
Tak jen letmym pohledem uvodni zavorka bloku patri na stejny radek jako statement tedy:
try { this.scriptEngine.eval(stringReader); } catch (ScriptException e) { e.printStackTrace(); } finally { stringReader.close(); }
a ne
try { this.scriptEngine.eval(stringReader); } catch (ScriptException e) { e.printStackTrace(); } finally { stringReader.close(); }
Pak nechapu zalomeni za prirazenim:
final String script = "1.5/2;";
Vzdy me prepkvapi, kdyz vidim vsemozne ruzne formatovani (vetsinou pochazejici z C/C++) i u nas ve firme, kde vsichni pouzivame Eclipse, ktery ma vychozi formatovani "Java Conventions" a jednoduchym "Ctrl+Shift+F" zformatuje vybrany blok textu nebo cely soubor. Nehlede na to, ze kod ktery sam doplnuje nebo napovida (try nasledovano Ctrl + mezera napr.) je formatovan dle konvenci. Schvalne na Vase zdrojove kody postvete formatovac v Eclipse (nebo jiny, prepodkladam jine IDE delaji neco podoneho) a uvidite v cem je "problem" :-).
Chapu, ze ve svych projektech se clovek temito konvencemi ridit nemusi (nebo na projektu kde si sef urci jinak) ale tady bych cekal opak.
Jiste, moje Eclipse to formatuje tak, jak je to uvedene v clanku a mel jsem pro to duvod - hlavni je ten, ze Root.cz ma - nevim proc, to je otazka na designery CSSek - vsechny clanky vysazene do relativne uzkych sloupcu, takze je lepsi formatovani "na vysku" nez "na sirku".
Lidi ze Sunu, kteri sesmolili tu specifikaci, meli opacny problem - nacpat co nejvice ukecaneho Javovskeho kodu na monitory postavene na sirku, proto vymysleli tu normu, na kterou odkazujete (a kterou Snoracle ne presne dodrzuje, viz napriklad zdrojaky OpenJDK).
Btw vy pouzivate odsazeni na tab nebo to je skutecne osm mezer? (ono to neni z prispevku upraveneho redakcnim systemem moc poznat)
Nemyslim, ze presunutim uvodnich zavorek bloku na druhou radku usetrite nejake misto do sirky. (spis tipuji na zvyk z C/C++ ala Allman - http://en.wikipedia.org/wiki/Indent_style)
Navic pokud jde o sirku, tam ja sam mam upraveny vychozi formatovac na 160 znaku, protoze vychozich 80 s ohledem na terminaly dnes nema smysl. Proc jste jen neupravil "Maximum line width" na pozadovany pocet znaku v zalozce "Line Wrapping" a nenechal zbytek na formatovaci? Napr. metoda v textu "testInvokeFunctionWithParameters" ma 100 znaku na sirku, neni duvod kratky try catch blok takhle zlamat.
Vim, ze zdrojove kody Javy se tim na mnoha mistech neridi (je to porad jen o lidech), to ale neni duvod to delat take.
Jinak ja pouzivam tab, ale jelikoz v komtentarich se tab pouzivat neda, odmezeroval sem to (Copy Paste asi 8 mezer).
No ono se to lehce tipovalo kdyz jsem kdysi davno cetl Vase OpenGL clanky :-).
Jinak jde mi hlavne o priklad ktery davate treba zacinajicim Javistum, aby nam to pak nepochytili a jeste se nam na takove clanky neodvolavali :-). To je jako kdyz doaleluja lidem vysvetluju, ze mistni rikaj Rigrak a ne Rigrace a pak si tam nakej moula z Horni Dolni da ceduli "Nejlepsi pivo v Rigracich" a hadejte se pak :-). Priklady zktratka tahnou, ty psane tuplem.
jeje, to bylo davno ;-)
Mozna ten clanek oznacime jako odstrasujici priklad, jak se to nema delat, ale pro praxi je IMHO dobre nasadit Checkstyle (+ bych urcite pridal Findbugs) a to bud primo na proceduru commit, coz ale nekdy nejde, nebo treba do Hudsonu.
Je to sice buzerace (a kolegove Vas budou proklinat :-), ale pro vetsi projekty asi schudne reseni.