pátek 25. listopadu 2005

Java včera, dnes a zítra

Dnes bych chtěl pár řádek věnovat Jave 5.0. Je to až s podivem, jak zpátečnický jsem si připadal, když jsem se na těchto stránkách skepticky rozepisoval o přechodu na Javu 5.0 viz Migrace na Javu 5.0, realita nebo utopie? (5.10.2004) a Přejít na Javu 5.0, ANO či NE? (30.5.2005). Od té doby už uběhlo hodně času a já jsem si ten přechod mohl prodělat na vlastní kůži.

Nyní už si tak zpátečnický nepřipadám a dokonce si troufám tvrdit, s odstupem času, že to byl docela racionální pohled. Tou největší změnou, kterou Java prodělala, bylo zavedení generických typů.

Ach jak povrchní byly všichni ti pisálkové, včetně mě samotného, jenž referovali o zavedení generik. Profláknutý příklad s generickou kolekcí budiž toho důkazem. Generiky rozšiřují sémantiku jazyka do takové míry, že pokud si je nenastudujete, budete si pravděpodobně připadat jako Alenka v říši divů. A věřte mi, že ne jenom při čtení zdrojového kódu.

Všechny ostatní vlastnosti, které pětková řada představila, jsou jenom kosmetickým vylepšením. Generiky změnily nebo posunuly jazyk úplně jinam. Jestliže budete chtít pochopit a používat generiky v plné síle, nebude Vám k tomu možná stačit ani fenomenální Generics FAQ (na papíře to děla 300 stránek) od Angeliky Langer.

Kromě toho, že budete muset načerpat mnoho pojmů jako raw type, wildcard, wildcard capture, type erasure, type argument inference, generická třída, generická metoda (mezi těmi je diametrální rozdíl). Také budete muset například pochopit, že je generická třída a generická třída konkrétního typu, a že mezi třídami konkrétních generických typů není dědičnost (jsou to nekompatibilní typy).

Podobných pastí a pastiček, kterými si budete muset prolézt, není zrovna málo. Možná to dojde tak daleko, že abyste pochopili a nebo realizovali použití generiky, bude se muset vžít do role kompilátoru. Apropo, když jsem u toho kompilátoru, jak si myslíte, že se zachová v následujícím případě, zkompiluje nebo nezkompiluje?


public class Foo {
    
  public static <T> T doSomething(){
   return doSomethingII();
  }
    
   
  public static <U> U doSomethingII(){
   return (U) new Object();
  } 
}

Pokud si myslíte, že zkompiluje, tak máte pravdu. Vy, co si myslíte, že to nezkompiluje, máte ovšem také pravdu! Záleží na tom, jaký kompilátor použijete. Pokud použijete kompilátor ze Sun SDK (testováno na verzi 1.5.0_04 a 1.5.0_05) tak máte smůlu. Pokud použijete Jikes kompilátor máte vyhráno (používá jej například IDE Eclipse nebo Tomcat).

Mimochodem, víte jak ten kód upravit tak, aby jej "baštil" i kompilátor ze Sun SDK? Je povelená úprava pouze na úrovni generik.

Tak taková je Java dnes. Každý nechť si položí otázku, jestli opravdu potřebuje a využije vlastnosti pětkové verze a jestli to pro něj nebude v důsledku spíše kotnraproduktivní. Když jsem nad tímhle zamyšlením dumal, inspirací mi byl pohled Eda Burnetta prezentovaný v článku Better, faster, stupider Java

Mylar is a plug-in for Eclipse and, being written from scratch, the developers decided to use all the newest features of JSE 5. One little problem, not everybody could use JSE 5. For example there is no JSE 5 support on RedHat Linux with GCJ. Oh, there probably will be someday, and maybe there are workarounds with retroweaver or something but that's not the point.

Language guys love to tweak. I know, because I'm a language guy myself. I used to work on compilers, code generators, libraries, and debuggers. We were always adding new stuff, new commands, special keywords, etc. Did our users thank us for it? Maybe the one or two that wanted the new things, but the vast majority would just groan when a new release came out. What will this break now? Will I have to upgrade? Will I have to use somebody else's code that requires this new thing before I'm ready? Has it been ported to all the machines I need to run on? Boring, I know, but very practical and important issues.

A jaká bude Java zítřejška?