pátek 8. září 2006

JUG - předběžný plán 2006

První setkání České Java User Group je za dveřmi, ale možná by Vás zajímalo, jaký program a hosté budou následovat na dalších setkáních v tomto roce. Datumy prosím berte jako předběžné. Také ne všichni přednášející potvrdili sovji účast, takže změny jsou vyhrazeny.

  • September 26th: Maven - Jason van Zyl (Maven, Apache Software Foundation), Miloš Kleint (Sun Microsystems)
  • October 31st: Annotations in Java - David Booth (JetBrains), Advanced Generics v Jave - Tomáš Záluský
  • November: Automatic testing of Enterprise Applications using Open Source tools - Bruno Bossola, "Applying Java EE 5" - Filippo Diotalevi
  • Future: Spring 2.0 - Roman Pichlik (Systinet), Portalová řešení v Jave - Ivo Martinik (VSB), přednáška o produktech Seebeyond (někdo ze Sunu), přednáška o RIA Yakov Fain (JDJ), Aspectj a AOP - Jiří Fabián

Pokud máte zájem přednést zajímavé téma, neváhejte a napište mi na email pichlik zavináč seznam tečka cz, pripadne na email Romana Štrobla - roman tečka strobl zavináč sun tečka com. Vaše ohlasy na zveřejněná témata jsou v diskusy pod tímto článkem vítány.

Aktuality

Java 7 - Java kernel, JRuby

Samé zajímavé novinky o Jave 7 (dříve označovaná jako Dolphin) vyplouvají na povrch. Krom Closures (Closures v Jave - funkce se bouří) a dalších novinek se zřejmě dočkáme podpory JRuby a konceptu takzvaného Java kernelu.

JRuby

Sun zaměstnal Charles Nuttera a Thomase Enoba, toho času hlavní vývojáře projektu JRuby. Tímto krokem Sun dává najevo, že má zájem adoptovat Ruby resp. aplikace na něm postavené. Tim Bray připravil FAQ k JRuby akvizici.

Z toho FAQ vyplývá, že to Sun s podporou skriptovacích jazyků myslí vážně. Krom zmíněného JRuby tu je projekt Phobos (JavaScript) a Semplice (VisualBasic) a měly by být podporováno PHP a Python.

Java kernel

Java kernel je projekt jehož cílem je vytvoření malého kompaktního java prostředí, které je schopné v případě potřeby bežící aplikace stáhnout dané core třídy. Dnešní JRE s velikostí kolem 16 MB je zbytečně nafouknuté pro určité typy aplikací (applety, command line nástroje), které využijí pouze malou část jeho tříd.

Původní myšlenka Ethana Nicholase na Java Browser Edition se ujala. Ethan je nyní součástí týmu, který má v Sunu tuto myšlenku rozpracovat, ale už jako obecný koncept Java kernelu viz spot "Java Browser Edition": New name, first steps.

Uvidíme jak se popere s odvážným prohlášením ohledně 3 MB JRE kompletně postačujícího pro běh appletů. Bez větších zásahů dokáže pro Hello World aplikaci s výpisem na konzoli ořezat stávající 6.0 JRE na velikost 2,8 MB a pro AWT aplikaci zobrazující Frame na 3,5 MB.

úterý 5. září 2006

Closures v Jave - funkce se bouří

Málokterý materiál týkající se Javy vyvolal v poslední době takový rozruch jako návrh začlenění funkčních typů a inline funkcí nazývaných Closures, za kterým stojí čtveřice Gilad Bracha, Neal Gafter, James Gosling, Peter von der Ahé. Přímou podporu funkčních typů mají například jazyky Ruby, Scala, Smalltalk a nebo JavaScript. Co to bude pro Javu znamenat, jak vypadá syntaxe a jaký mají Closures ohlas - to všechno jsou otázky, na které se pokusíme odpovědět.

Java podporuje anonymní vntiřní třídy, všichni je známe a používáme. Ilustrační příkad pro připomenutí.

List<Person> persons = ...;
Collections.sort(persons, new Comparator<Person>() {
   public int compare(Person a, Person b) {
      return a.getAge() - b.getAge();
   }
});

Metoda sort má dva argumenty, sortovaný list a komparátor, který implementuje vlastní porovnání. V tomto případě je komparátor implementován jako anonymní vnitřní třída.

Closures

Výše zmíněný dokument představuje koncept anonymní funkce též zvaný Closure. V našem příkladu tak bude možné anonymní vnitřní třídu komparátoru nahradit anonymní funkcí. V takovém případě může kód vypadat následovně.

List<Person> persons = ...;
Collections.sort(persons, int(Person a, Person b) { return a.getAge() - b.getAge()});

Kód int(Person a, Person b) {return a.getAge() - b.getAge();} je ona anonymní funkce (closure). V době kompilace se closure přeloží přesně na ten samý kód jako v případě použití anonymní vnitřní třídy. Zamýšlená syntaxe umožňuje využití odvození návratového typu.

Collections.sort(persons, int(Person a, Person b: a.getAge() - b.getAge());

Collections.sort(persons, int(Person a, Person b) { a.getAge() - b.getAge()});

Syntaxe closure by měla umožnit použití zkrácené formy zápisu, v takovém případě je closure napasován jako druhý argument metody.

List<Person> persons = ...;
Collections.sort(personsint(Person a, Person b) {
   return a.getAge() - b.getAge();
}

Lokální funkce

Lokální funkce v signatuře definuje argumenty, návratový typ a případně výjimky v throws klauzuli.

int plus2(int x) { return x+2}

Lokální funkce je zároveň referenčním typem. Následuje přiřazení do proměnné typu lokální funkce.

int(intplus2b = plus2;

A jako takovou lze lokální funkcí zavolat.

System.out.println(plus2b(2));

Pohled na celek

public static void main(String[] args) {
  int plus2(int x) { return x+2}
  int(intplus2b = plus2;
  System.out.println(plus2b(2));
}

Dopad na jazyk

Lokální funkce (closers jsou jejich anonymním vyjádřením) zavádějí do Javy nový rozměr. Pokud jsme doposud mohli vzít jako základní konstrukt objekt, zavedením lokálních funkcí musíme přibrat navíc funkci. Funkce na rozdíl od objektu nemá vnitřní stav a komunikační rozhraní je definováno vstupem a výstupem.

Můžeme tedy napsat metodu, která bude mít jako jeden z argumentů nikoliv objekt, ale funkci se kterou bude pracovat.

/**
 * Obecná metoda pro hledání v seznamu osob, vlastní hledání je 
 * definováno na úrovni funkčního typu.
 *  
 @param concreteFinder funkce která implementuje hledání
 @return seznam osob
 */ 
public List<Person> find(boolean(PersonconcreteFinder) {
  List<Person> persons = ...//načtení dat např. z DB
  List<Person> foundPersons = new ArrayList<Person>();
  for(Person p: persons){
      if(concreteFinder(p)){
        foundPersons.add(p);
      }      
  }
  return foundPersons;   


//lokální funkce, která vrací true v případě, že je osoba nezletilá
boolean(PersonteenFinder = (Person p: p.getAge() 19;

//použití
List<Persons> teenagers = find(teenFinder);

Ohlasy

Zatím se zdá, že je část vývojářů, kteří si slastně mlaskají podstatně menší než ta, která se cítí zmateně. Pokud pominu ultrageeky, tak jsem získal pocit, že vývojářů, kteří si po něčem takovém stýskají je velice málo. Vesměs by se ten postoj dal pospat Opravdu to potřebuji?. Syntaktické veletoče (jinak se tohle nazvat nedá) mají tu nespornou nevýhodu, že boží zpětnou kompatibilitu a činí kód hůře čitelnějším. Samozřejmě musíme vzít jako bernou minci pokročilejší konstrukce (například subtyp funkce boolean(Person) teenFinder = (Female f) : f.getAge() < 19; , či přetypování) ne ilustrativní příklad komparátoru.

Budoucnost

Na přesné specifikaci closures a lokálních funkcí se stále pracuje, takže ne vše výše uvedené musí v budoucnu platit. Pokud budou closers začleněny do Javy mělo by to být ve verzi 7. Související odkazy s tímto tématem můžete najít pěkně pohromadě v článku Closures Syntax in Java 7.