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
- Joda Time homepage
- JSR 310
- Jak nás vypek DateFormat.parse() – povzdechnutí nad JDK implementací
- Stephen Colebourne’s blog – JSR 310
- Alex Miller – malá poznámka JSR 310
- diskuse na The server side
- zajímavá je především diskuse na konci článku, kde se rozebírá vznik Date & Time API v Javě – paradoxně tvůrcem API má být jakási firma Taligent koupená IBM, která se profilovala především v oblasti C++ více také zde – přímo na stránkách IBM




(10 hlasů, průměrně: 4.70 z 5)
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
))
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í.
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.
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.
Hezký článek, děkuji, tohle se mi určitě bude někdy hodit…