Ještě pořád se držíte JDK, když je po ruce Joda Time?

Po delší době jsem měl zase čas podívat se na zoubek v mém TODO listu. Tentokrát jsem si vzal na paškál poměrně malou knihovnu s názvem Joda Time. Cílem této knihovny je reimplementace Java API pro práci s datumy a časem. Každý z nás, kdo pracuje s Javou nějaký ten čas, se tu a tam potýká s tímto těžkopádným API. Joda Time přinesl poměrně hodně nových myšlenek a stal se základem pro JSR 310, které by mělo být součástí nové Javy 7. Často na toto téma naráží i pánové z Java Posse. Co je tedy na knihovně tak úžasného? Čtěte dál …

Joda Time se snaží práci s časem přiblížit co nejvíce přirozenému způsobu zacházení s časem v běžném životě. Tak například leden v Joda Time je první měsíc roku a ne nultý jako v Java API – když si vzpomenu kolikrát jen mě tahle hloupost vypekla. Dokáže pracovat s přirozenými entitami jako je čas bez datumu, datum bez času, časová perioda, časový interval a doba trvání. Odbourává netransparentní seznam konstant, který je potřeba pro práci s Java API ve třídě Calendar. Výsledkem je i pozitivní zpřehlednění našeho vlastního API – v parametrech metod nám proplouvají smysluplné objekty (např. Interval openHours místo Date open, Date close), čitelnost kódu se výrazně zvyšuje.

Joda Time poměrně extenzivně využívá builder patternu, který je postaven na jednoduchém principu – volání metody na objektu vrací instanci stejné třídy jako návratovou hodnotu. Výsledným efektem je, že se dá volání metod přirozeně řetězit, což značně zvyšuje čitelnost kódu a přibližuje jeho vzhled přirozené lidské mluvě.

Nejčastěji používané objekty jsou immutable (neměnitelné), což znamená, že je bezpečné s nimi manipulovat paralelně ve více threadech současně, aniž bychom se museli starat o synchronizaci. Knihovna poskytuje i mutable varianty objektů, které se vyplatí používat pouze v případech, kdy dochází k větší manipulaci s časem na úrovni lokální proměnné (analogie k String a StringBuffer třídám).

Posuďte sami na ukázkovém kódu níže:

Pokrytí všech MUST-HAVE

Learning curve

Pročíst jednoduchý tutorial a přejít na toto API vám nedá víc jak 1 – 2 hodiny. Výsledné zpřehlednění kódu a ušetření “mentální” námahy při práci s datumy vám za to určitě stojí.

Interoperabilita se standardními Date & Time objekty v JDK

Základem je interoperabilita se objekty Date v základním API Javy. Konverze je jednořádková:

Převod ze Stringu a na String

Podpora formátování datumů a v opačné směru parsování datumů ze Stringů. Základem je starý dobrý formát ze SimpleDateFormat, nicméně velmi zajímavá je i možnost vytváření vlastních parserů / formatterů následujícím způsobem:

Což dokáže převádět tam i zpět datumy ve formátu “12-Led-04″.

Cenné NICE-TO-HAVE

Výkonnostně předčí standardní Java API

V dokumentaci se autoři Joda Time holedbají rychlostí, která má být ve všech případech větší než při použití standardního Java API. Já jsem si udělal jen jednoduchý testík, o kterém bych nechtěl absolutně tvrdit, že je průkazný, ale dal mi poměrně zajímavé výsledky. Úkázkový kód z prvního přikladu tohoto článku jsem spustil v milionu iterací a zpracování pomocí Joda Time zabralo asi jen okolo 45% času zpracování pomocí Java API. Příjemné.

Podpora pro automatické testy

Tento bonbónek mne velmi mile překvapil. Jedním z problémů při psaní testů pro kód operující se systémovým časem (typicky se jedná o testování metod pracujících s “aktuálními” entitami, které se odvozují od aktuálního systémového času). Při práci s klasickými datumovými objekty Java API nemáte jinou možnost (krom přenastavení systémového času, což bych jako taktiku zrovna nedoporučoval) než testovaným třídám vnutit čas zvenku tak, abyste mohli v testu zaručit “stabilní” testovací čas.

Joda Time umožňuje “virtuálně” přenastavit systémový čas, takže pokud v metodě pracujete s aktuálním časem přes defaultní konstruktory Joda API – tzn. new DateTime() a nikoliv new DateTime(System.currentTimeMillis()), můžete využít při testování virtuálně overridnutý čas:

Prostě další střípek do JUnit test enabled APIs.

Easy to use with Maven 2

Knihovna je buildovaná Mavenem, takže ve veřejné repository najdete aktuální verzi. Stačí když do svého pomu přidáte:

… a můžete začít experimentovat.

Zdroje

Podělte se s ostatními:
  • Digg
  • del.icio.us
  • Technorati
  • Diigo
  • DZone
  • FriendFeed
  • Google Bookmarks
  • LinkedIn
  • Reddit
  • RSS
  • StumbleUpon
  • Twitter
Ohodnoťte článek:
Takovéhle články už radši ne!Nic nového pod sluncem.Průměr - obsahuje zajímavé střípky informací.Hodnotný článek - lecos nového jsem se dozvěděl.Skvělý článek - informace se mi dost hodí. (10 hlasů, průměrně: 4.70 z 5)
Loading ... Loading ...

3 reakcí to “Ještě pořád se držíte JDK, když je po ruce Joda Time?”

  1. Jakub Doležal:

    Diky za pekny clanek o zajimavem frameworku. Stavajici podpora Date & Time API v Jave je opravdu hrozna. Skoda, ze jsem o nicem takovem necetl pred ctyrmi mesici. Byvalo by mi to usetrilo dost prace :-) ))

  2. Ladislav Thon:

    Stoprocentní souhlas, JodaTime je konečně rozumné API pro datum a čas. _Tohle_ mělo být ve standardní knihovně už dávno, ne ten běs, co je tam už drahně let a nad kterým je postaveno takového kódu, až to hezké není.

  3. Novoj:

    Je to tak – v kritice na datumové Java API jsem vyčetl, že jeho nedokonalost (jen nevím v jakém směru) donutila autory JDBC vytvořit klony datumových tříd java.sql.Date a java.sql.Timestamp – jen jsem nějak už nevyčetl, jaké důvody to byly. Každopádně to rozhraní je skutečně více C++ než Java like.

  4. winsik:

    Diky moc za clanek. Vypada to opravdu dobre

    Calendar. get(Calendar….. mi opravdu pilo krev.

    Jestli bude opravdu i soucasti 7 tak to asi povede i k predelani starsich veci v ramci zlepseni citelnosti kodu.

  5. Jety:

    Hezký článek, děkuji, tohle se mi určitě bude někdy hodit…

Nechte zde svůj komentář

Opište prosím text z obrázku: