Kotlin – 10 důvodů, proč ho mám rád

Kotlin - 10 důvodů, proč ho mám rád

Kotlin má velkou řadu funkcí, které je snadné si zamilovat. V tomto článku vám prozradím svých deset nejoblíbenějších a vysvětlím, proč jsou tak super.

1. Null Safety

Kotlin je takzvaný null safety jazyk.

V tomto příkladě nemůžete proměnným address a telephone přiřadit hodnotu null. V případě, že jim nastavíte hodnotu null, tak již během kompilace budete na tuto skutečnost upozorněni:

Compilation errorPokud chcete proměnné přiřadit hodnotu null, pak je nutné to explicitně nadefinovat. To uděláte přidáním “?” za typ proměnné (viz příklad emailu jako proměnné výše).

Pokud tedy explicitně řeknete, že proměnná může obsahovat i null hodnotu, tak se vám může stát, že se potkáte se starou známou NullPointerException (NPE), kterou jistě každý z nás moc dobře zná z Javy.

Abyste vyřešili kompilační chybu x.length, můžete použít if-statement:

Nebo to můžete udělat ještě lépe prostřednictvím tzv. “safe calls”, které vrátí hodnotu volání, pokud volající není nulový (jinak se vrátí null).

Elvis Operator

Pomocí funkce „Elvis Operator“ můžete pracovat s nulovými typy efektivněji.

V tomto případě bude použita length, pokud x není nulové, jinak bude použito -1 (výchozí hodnota).

 

2. Datová třída

Pokud vytváříte např. business logiku, perzistentní vrstvu apod., vytváříte většinou doménové objekty, třídy, které slouží pouze pro uchovávání dat (POJO). Uveďme si to na následujícím příkladu. Máme třídu Customer, která bude uchovávat data o id zákazníka, jméně a emailu.

V jazyce Java:

Jazyk Kotlin má pro tyto účely speciální označení třídy, tzv. datová třída (data class).

Kompilátor Kotlinu pak k data class vygeneruje:

  • funkce hasCode(), equals(), toString()
  • přidá funkci copy() (o této funkci mluvím níže)
  • funkce componentN()

Kopírování objektů v datové třídě

Někdy se stane, že potřebujete zkopírovat objekt do nového s různými hodnotami proměnných. K tomu slouží již zmíněná funkce copy(), kterou obsahuje každá třída, která je označena jako datová (data class).

 

3. Extension funkce

Kotlin nám umožňuje rozšířit funkčnost existujících tříd bez použití dědičnosti.

Funkce capitalize() je extension funkce třídy String. Uvnitř této extension funkce získáte po zadání klíčového slova “this” přístup k objektu, na který byla aplikována.

Extension funkce nemění třídy, které rozšiřuje. Vše je vyřešeno staticky.

Díky extension funkcím je kód v projektech, kde používám Kotlin, daleko čistější. Vyhnu se tak totiž xxUtils(.java) třídám.

Dobrým příkladem pro použití funkce rozšíření by mohla být konverze na JSON. Ukážeme si to na velmi jednoduchém příkladu, který přidává extension funkci do všech “objektů” v Kotlinu (kotlin.Any a java.lang.Object jsou různé typy, ale během spuštění jsou reprezentovány stejnou třídou java.lang.Object).

 

4. Smart Cast

Tahle funkce mi neuvěřitelně usnadňuje život.

Jak často používáte přetypování objektů? A jak často jste pak zjistili, že to bylo zbytečné?

Pokud chcete například zkontrolovat objekt, který je instancí typu java.lang.String, abyste vypsali délku řetězce, musíte nejdříve zkontrolovat typ a pak přetypovat objekt na String předtím, než získáte přístup ke konkrétní metodě z objektu String. Když jsem začal pracovat s Kotlinem, nepovažoval jsem to za nic převratného, ale po pár dnech jsem zjistil, že mi tato funkce v Javě vyloženě chybí.

SmartcastKompilátor v Kotlinu je zatraceně chytrý, když přijde na přetypování. Všechny nadbytečné operace zvládne za vás.

Operátor instanceof v Javě se v Kotlinu zapisuje operátorem is. V příkladu výše vidíte, že v Kotlinu nemusíte přetypovávat objekt uvnitř statementu, pokud jste ho už zkontrolovali operátorem is. Nadbytečné přetypování v Javě mi nepřišlo divné, dokud jsem nezačal používat Kotlin.

Další místo, kde vidíte smart cast, je ve výrazech když (when expressions):

SmartcastSmart Cast dohromady s výrazem when dokáže pěkně zpřehlednit kód:

06_smartcast3

Na příkladu výše vidíte, že příchozí eventa, která přišla z Event busu, musí být nejprve zkontrolována, jestli je instancí konkrétního event objektu. Následně je přetypována na příslušný Java objekt. Připouštím, že v Javě to v tomto případě tak hrozně nevypadá, ale podívejte se na stejný kód v Kotlinu:

Smartcast

Myslím, že můžu s čistým svědomím prohlásit, že Kotlin zde vítězí na plné čáře.

 

5. Singleton (Objekt)

Další skvělou vlastností Kotlinu je jednoduchost, s jakou můžete definovat “singleton” objekty. Nejprve si však připomeňme, jak se singleton zapisuje v Javě.

Použití singletonu v Javě může vypadat takto:

Zápis singletonu v Kotlinu uděláme opravdu jednoduše. Použijeme klíčové slovo object, které umožní definovat objekt, který existuje pouze jako single instance.

 

6. Funkcionální programování

Kombinace použití lambda výrazů a Kotlinu nám značně může ulehčit práci s kolekcemi:

Nebo:

 

7. Typová inference

V Kotlinu nemusíte explicitně definovat typ každé proměnné:

 

8. Výchozí argumenty

V Javě často musíte duplikovat kód, abyste definovali různé varianty metod nebo konstruktoru:

Kotlin na to jde jinak. Má podporu zapisování tzv. výchozích argumentů (default arguments).

 

9. Pojmenované argumenty

Výchozí argumenty se kombinací s pojmenovanými argumenty stávají velice silnou zbraní v boji za přehlednější kód. Můžete to vidět na příkladu vytvoření instance našeho OperatorInfoInKotlin z předchozí části:

Nyní zpět do Javy.

Z tohoto kódu v Javě bez znalosti třídy OperatorInfoInJava nepoznáte, které hodnoty jsou nastaveny.

// Java
new OperatorInfoInJava("Vaclav", false, false, "blabla");

 

10. Práce s kolekcemi

V Kotlinu máte funkce vyššího řádu, lambda výrazy, přetížení operátora a mnoho dalších užitečných metod pro práci s kolekcí.

Ukážeme si to na jednoduchém příkladu:

„Jaký je průměrný věk zaměstnanců ve firmě v Plzni?“

(kód níže je v jazyce Java 1.6, samozřejmě, že v 1.8 za použítí streamu můžete kód napsat přes lambdu i v Javě )

Extension funkce a funkcionální programování jsou výborným nástrojem a Kotlin má mnoho užitečných rozšíření pro práci s kolekcemi.

Stejný úkol můžete v Kotlinu provést v následujících krocích.

Nejdříve vyfiltrujete a uchováte všechny zaměstnance, kteří jsou z Plzně.

Pro více informací o kolekci si prohlédněte oficiální dokumentaci nebo článek na blogu Antonia Leiva.

O Kotlinu samotném se víc dozvíte v mém předchozím článku Kotlin – jazyk, který je dobré znát.

Které funkce Kotlinu jste při práci nejvíc ocenili vy?

Václav Souhrada
Kotlin & Android Developer at eMan, Czech Kotlin User Group Founder and Organizer
  • VK

    Pekne napsane, diky.

    • Václav Souhrada

      Děkujeme, doufám že se budou líbit i další články 🙂

Sledujte nás

Kontakt

+420 222 202 222
info@eman.cz

Sídlo a hlavní kancelář:
U Pergamenky 1145/12
170 00 Praha 7

Pobočka Hradec Králové:
Šimkova 1224/2B
500 03 Hradec Králové

Pobočka Plzeň:
Teslova 1266/7
301 00 Plzeň

Pobočka Mladá Boleslav:
Palackého 267
293 01 Mladá Boleslav

Sdíleno