Plánuji pravidelně aktualizovat a rozšiřovat tento příspěvek během prvních pár měsíců práce s Kotlinem. Zmíním věci, které se mi v Kotlinu líbí, co mi chybí nebo co se mi nelíbí a čím si ještě nejsem jistý. Postupem času se můj názor na jednotlivé věci pravděpodobně bude měnit v závilosti na získávání více zkušeností s tímto jazykem.
Jakákoliv diskuse a kritika je vítána. Jelikož se Kotlin právě začínám učit, některé věci můžou býti odlišné v realitě než se mi zdají právě teď.
Co se mi líbí na Kotlinu
1. Extension functions
Extension functions jsou v podstatě více intuitivní a méně ukecané Utils metody. Jsou deklarovány jako funkce patřící do určité třídy (upozornění: nejsou členskými funkcemi této třídy, více o tomto později). Mohou být definovány kdekoliv (v souboru nebo dokonce jako členská funkce jiné třídy).
A ano, je možné přistoupit k atributům třídy (properties v Kotlinu) a funkcím z extension funkcí bez reference na instanci.
Extension funkce lze volat stejným způsobem jako členské funkce:
Buďte opatrní, tyto funkce nejsou členskými funkcemi a nemění žádnou třídu. To znamená, že nemohou přepsat členské funkce a ani podtřídy přijímající třídy nemohou tyto funkce přepisovat na členské funkce (ale mohou být přepsány jako extension funkce s podtřídou jako přijímačem).
Kromě extension funkcí je možné použít také extension properties, ale s určitými omezeními. Jelikož nejsou skutečně členy rozšířené třídy, nemusí být inicializovány. Metody get / set by měly být definovány explicitně. Takže jsou v podstatě stejné jako extension funkce jen s kratší notací.
Extension funkce jsou vyhodnocovány staticky, což znamená, že pokud máte dvě extension funkce pro třídu a podtřídu se stejným jménem, vždy bude volána ta, která byla deklarována (MyClass v tomto příkladu):
Pokud jste si mysleli, že to je nějaké kouzlo, není, ale čarovat se s tím rozhodně dá! Představte si, kolik funkcí můžete přidat do běžných tříd, které nemáte možnost upravit. Například Kotlin už používá některé v kolekcích nebo rozšířeních pro Android. Je možné přidat libovolné funkce libovolné existující třídě a volat je tak, jako by skutečně byly součástí dané třídy. Vše pak vypadá logičtěji a drasticky se zredukuje opakující se ukecaný kód.
Napadají mě další možnosti využítí pro tyto rozšíření zkombinované s jinými technologiemi.
Za prvé, annotation processing (nebo jakékoliv generování kódů) se stává mnohem mocnější pomocí extension funkcí. Snadno se dají vygenerovat přístupové metody pro existující třídu, které používají jinou vygenerovanou třídu. Plánujeme využít tento přístup v naší knihovně a nasdílíme výsledky hned jakmile to bude možné.
Druhým použitím je rozšíření třídy Observable pro RxKotlin. Vytvoření nových Rx operátorů je nyní mnohem snadnější. Jen malý příklad:
Čeho všeho můžete pomocé extensions dosáhnout je omezeno jen vaší představivostí.
Jak používáte extensions v Kotlinu vy? Nebojte se to napsat přímo v komentářích nebo přímo mně.
2. Přetěžování funkcí a výchozí parametry
To je věc, kterou v Javě opravdu nenávidím. Když chci vytvořit novou instanci fragmentu a v závislosti na místě, ze kterého vytvářím tuto instanci, musím předat žádný, jeden nebo více argumentů. Někdy se některé z těchto množin argumentů překrývají, někdy ne. Potřebuji tedy vytvořit další metody newInstance(), předat některé argumenty jako null (což snižuje čitelnost) nebo používat chytřejší návrhové vzory typu Builder (což produkuje ještě více ukecaného a zbytečného kódu).
Pamatujte na starou krásnou metodu query() z SQLite?
Vzpomínám, když jsem psal svůj vlastní wrapper pro query(), napsal jsem více než deset přetížených metod.
V Kotlinu můžete zapomenout na přetěžování v tomto stylu. Funkci stačí definovat pouze jednou se všemi argumenty, definovat výchozí hodnoty a volat pouze ty, které potřebujete.
Navíc, pokud potřebujete předat více argumentů než jeden, můžete použít tzv. pojmenované argumenty.
Je to velice intuitivní, čitelné a šetří to spoustu kódu.
Je dobrým zvykem používat pojmenované argumenty pro funkce s více argumenty i v případě, že je to nepovinné, jelikož programátor hned vidí co je funkci předáváno, aniž by se musel dívat na samotnou deklaraci funkce.
Zde si přečtěte zbytek článku…