Programování

Co je Kotlin? Vysvětlení alternativy Java

Kotlin je univerzální, bezplatný, otevřený zdrojový, staticky napsaný „pragmatický“ programovací jazyk původně navržený pro JVM (Java Virtual Machine) a Android, který kombinuje objektově orientované a funkční programovací funkce. Zaměřuje se na interoperabilitu, bezpečnost, přehlednost a podporu nástrojů. Ve výrobě jsou také verze Kotlin zaměřené na JavaScript ES5.1 a nativní kód (využívající LLVM) pro řadu procesorů.

Kotlin vznikl ve společnosti JetBrains, která stojí za společností IntelliJ IDEA, v roce 2010 a je otevřeným zdrojem od roku 2012. Tým Kotlin má v současné době více než 90 členů na plný úvazek z JetBrains a projekt Kotlin na GitHubu má více než 300 přispěvatelů. JetBrains používá Kotlin v mnoha svých produktech, včetně své vlajkové lodi IntelliJ IDEA.

Kotlin jako výstižnější jazyk Java

Na první pohled vypadá Kotlin jako stručnější a efektivnější verze Javy. Zvažte výše uvedený snímek obrazovky, kde jsem automaticky převedl ukázku kódu Java (vlevo) na Kotlin. Všimněte si, že bezduché opakování inherentní instanci proměnných Java odešlo. Idiom jazyka Java

StringBuilder sb = nový StringBuilder ();

Stává se v Kotlinu

val sb = StringBuilder ()

Můžete vidět, že funkce jsou definovány pomocí zábava klíčové slovo a že středníky jsou nyní volitelné, jsou-li k dispozici nové řádky. The val klíčové slovo deklaruje vlastnost jen pro čtení nebo místní proměnnou. Podobně var klíčové slovo deklaruje proměnlivou vlastnost nebo místní proměnnou.

Přesto je Kotlin silně typizovaný. The val a var klíčová slova lze použít, pouze pokud lze odvodit typ. Jinak musíte deklarovat typ. Zdá se, že se odvození typu zlepšuje s každým vydáním Kotlin.

Podívejte se na deklaraci funkce v horní části obou panelů. Návratový typ v Javě předchází prototyp, ale v Kotlinu následuje prototyp, ohraničený dvojtečkou jako v Pascalu.

Z tohoto příkladu to není zcela zřejmé, ale Kotlin uvolnil požadavek Javy, aby byly funkce členy třídy. V Kotlin mohou být funkce deklarovány na nejvyšší úrovni v souboru, místně uvnitř jiných funkcí, jako členská funkce uvnitř třídy nebo objektu a jako funkce rozšíření. Funkce rozšíření poskytují C # schopnost rozšířit třídu o nové funkce, aniž byste museli zdědit z třídy nebo použít jakýkoli typ návrhového vzoru, jako je Decorator.

Pro fanoušky Groovy implementuje Kotlin stavitele; ve skutečnosti lze stavitele Kotlin typově zkontrolovat. Kotlin podporuje delegované vlastnosti, které lze použít k implementaci líných vlastností, pozorovatelných vlastností, vetovatelných vlastností a mapovaných vlastností.

Mnoho asynchronních mechanismů dostupných v jiných jazycích lze implementovat jako knihovny pomocí Kotlinových rutin. To zahrnuje asynchronní/čekat z C # a ECMAScript, kanály a vyberte z Go, a generátory/výtěžek z C # a Pythonu.

Funkční programování v Kotlinu

Povolení funkcí nejvyšší úrovně je pro Kotlin jen začátkem příběhu funkčního programování. Jazyk také podporuje funkce vyššího řádu, anonymní funkce, lambdas, vložené funkce, uzávěry, rekurze ocasu a generika. Jinými slovy, Kotlin má všechny funkce a výhody funkčního jazyka. Zvažte například následující funkční Kotlinovy ​​idiomy.

Filtrování seznamu v Kotlin

val positives = list.filter {x -> x> 0}

Pro ještě kratší výraz použijte to když je ve funkci lambda pouze jeden parametr:

val positives = list.filter {it> 0}

Procházení mapy / seznamu párů v Kotlinu

pro ((k, v) na mapě) {println („$ k -> $ v“)}

k aproti lze nazvat cokoli.

Používání rozsahů v Kotlin

pro (jsem v 1..100) {...} // uzavřený rozsah: zahrnuje 100

pro (jsem v 1 do 100) {...} // napůl otevřený rozsah: nezahrnuje 100

pro (x v 2..10 krok 2) {...}

pro (x v 10 dolů 1) {...}

pokud (x v 1..10) { ... }

Výše uvedené příklady ukazujípro klíčové slovo i použití rozsahů.

Přestože je Kotlin plnohodnotným funkčním programovacím jazykem, zachovává většinu objektově orientované povahy Javy jako alternativního programovacího stylu, což je velmi užitečné při převodu stávajícího kódu Java. Kotlin má třídy s konstruktory spolu s vnořenými, vnitřními a anonymními vnitřními třídami a má rozhraní jako Java 8. Kotlin dělá ne mít Nový klíčové slovo. Chcete-li vytvořit instanci třídy, zavolejte konstruktor stejně jako běžnou funkci. Viděli jsme to na snímku obrazovky výše.

Kotlin má jedinou dědičnost od pojmenované nadtřídy a všechny třídy Kotlin mají výchozí nadtřídu Žádný, který je ne stejné jako základní třída Java java.lang.Object. Žádný obsahuje pouze tři předdefinované členské funkce: se rovná(), hashCode (), a toString ().

Třídy Kotlin musí být označeny otevřeno klíčové slovo, aby z nich mohly zdědit další třídy; Třídy Java jsou jakýmsi opakem, protože jsou dědičné pokud označeno finále klíčové slovo. Chcete-li přepsat metodu nadtřídy, musí být označena samotná metoda otevřenoa musí být označena metoda podtřídy přepsat. Jedná se o kus Kotlinovy ​​filozofie, která dává věci jasně najevo, místo aby se spoléhala na výchozí hodnoty. V tomto konkrétním případě vidím, kde se Kotlinův způsob výslovného označování členů základní třídy jako otevřených pro dědičnost a odvozených členů třídy jako přepisů vyhýbá několika druhům běžných chyb Java.

Bezpečnostní prvky v Kotlin

Když už mluvíme o vyhýbání se běžným chybám, byl Kotlin navržen tak, aby eliminoval nebezpečí odkazů na nulový ukazatel a zjednodušil zpracování nulových hodnot. Dělá to tak, že dělá nula nelegální pro standardní typy, přidávání typů s možnou hodnotou null a implementace zkratek pro zpracování testů na hodnotu null.

Například běžná proměnná typuTětiva nemůže držetnula:

var a: String = "abc"

a = null // chyba kompilace

Pokud potřebujete povolit hodnoty null, například k uložení výsledků dotazu SQL, můžete deklarovat typ s možnou hodnotou null připojením otazníku k typu, např. Tětiva?.

var b: Řetězec?

b = null // OK

Ochrany jdou trochu dále. Non-nullable typ můžete použít beztrestně, ale před použitím musíte otestovat null typ na hodnoty null.

Aby se zabránilo podrobnou gramatiku, která je normálně nutná pro nulové testování, zavádí Kotlin a bezpečné volání, psaný ?.. Například, b? .délka se vrací b. délka -li b není nula, a nula v opačném případě. Typ tohoto výrazu je Int?.

Jinými slovy, b? .délka je zkratka pro if (b! = null) b.length else null. Tato syntaxe řetězce pěkně eliminuje spoustu logiky prolixů, zvláště když byl objekt naplněn z řady databázových dotazů, z nichž každý mohl selhat. Například, bob? .oddělení? .head?. jméno vrátí jméno vedoucího oddělení Bob, pokud jsou Bob, oddělení a vedoucí oddělení nenulové.

Chcete-li provést určitou operaci pouze pro nenulové hodnoty, můžete použít operátor bezpečného volání ?. dohromady snechat:

val listWithNulls: List = listOf ("A", null)

pro (položka v seznamuWithNulls) {

item? .let {println (it)} // vytiskne A a ignoruje null}

Často chcete vrátit platnou, ale speciální hodnotu z výrazu s možnou hodnotou Null, obvykle proto, abyste ji mohli uložit do typu s možnou hodnotou Null. K tomu existuje speciální syntaxe, která se nazývá Elvisův operátor (I kid you not), napsaná ?:.

val l = b? .délka?: -1

je ekvivalentem 

val l: Int = if (b! = null) b.length else -1

Stejně tak Kotlin vynechává kontrolované výjimky Javy, což jsou házivé podmínky musí být chycen. Například podpis JDK

Appendable append (CharSequence csq) vrhá IOException;

vyžaduje, abyste chytili IOException pokaždé, když zavoláte připojit metoda:

Snaž se {

log.append (zpráva)

}

chytit (IOException e) {

// Udělejte něco s výjimkou

}

Návrháři Javy si mysleli, že je to dobrý nápad, a pro programy hraček to byla čistá výhra, pokud programátoři implementovali něco rozumného do chytit doložka. Až příliš často ve velkých programech Java však vidíte kód, ve kterém je povinný chytit klauzule neobsahuje nic jiného než komentář: // úkol: zvládněte to. To nikomu nepomůže a kontrolované výjimky se ukázaly jako čistá ztráta pro velké programy.

Kotlinské rutiny

Coroutiny v Kotlinu jsou v podstatě lehká vlákna. Začnete je pomocí zahájení coroutine builder v kontextu některých CoroutineScope. Jeden z nejužitečnějších rozsahů coroutinu je runBlocking {}, který se vztahuje na rozsah jeho bloku kódu.

importujte kotlinx.coututiny. *

fun main () = runBlocking {// this: CoroutineScope

launch {// launch a new coroutine in the scope of runBlocking

delay (1000L) // neblokující zpoždění po dobu 1 sekundy

println ("Svět!")

    }

println ("Dobrý den,")

}

Tento kód vytváří následující výstup s jednosekundovým zpožděním mezi řádky:

Ahoj,

Svět!

Kotlin pro Android

Až do května 2017 byly jedinými oficiálně podporovanými programovacími jazyky pro Android Java a C ++. Google oznámil oficiální podporu Kotlin pro Android na Google I / O 2017 a počínaje Android Studio 3.0 je Kotlin zabudován do vývojové sady Android. Kotlin lze přidat do dřívějších verzí Android Studio pomocí pluginu.

Kotlin kompiluje do stejného bajtového kódu jako Java, přirozeně spolupracuje s třídami Java a sdílí své nástroje s Javou. Protože mezi Kotlinem a Javou neexistuje režie pro volání tam a zpět, přidávání Kotlin inkrementálně do aplikace pro Android aktuálně v Javě má ​​smysl. Těch několik případů, kdy interoperabilita mezi Kotlinem a kódem Java postrádá gráci, jako jsou vlastnosti Java set-only, se setkáváme jen zřídka a lze je snadno opravit.

Pinterest byl potomkem plakátu pro aplikace pro Android napsaný v Kotlině již v listopadu 2016 a byl prominentně zmíněn na Google I / O 2017 jako součást oznámení Kotlin. Tým Kotlin navíc rád cituje aplikace Evernote, Trello, Square a Coursera pro Android.

Kotlin vs. Java

Otázka, zda si pro nový vývoj zvolit Kotlin nebo Java, se v komunitě Android od oznámení Google I / O hodně objevuje, ačkoli lidé se na tuto otázku ptali již v únoru 2016, kdy byl dodáván Kotlin 1.0. Krátká odpověď je, že kód Kotlin je bezpečnější a výstižnější než kód Java a že soubory Kotlin a Java mohou koexistovat v aplikacích pro Android, takže Kotlin je užitečný nejen pro nové aplikace, ale také pro rozšiřování stávajících aplikací Java.

Jediným přesvědčivým argumentem, který jsem viděl při výběru Javy nad Kotlinem, by byl případ úplných nováčků ve vývoji systému Android. Pro ně by mohla existovat překážka překonání vzhledem k tomu, že historicky je většina dokumentace a příkladů pro Android v Javě. Na druhou stranu, převod Java na Kotlin v Android Studio je jednoduchá záležitost vložení kódu Java do souboru Kotlin.

Pro téměř kohokoli jiného, ​​kdo provádí vývoj systému Android, jsou výhody Kotlin přesvědčivé. Typický čas, který se vývojář v Javě musí naučit Kotlin, je několik hodin - malá cena, kterou musíte zaplatit, abyste odstranili chyby nulové reference, povolili funkce rozšíření, podporovali funkční programování a přidali coutiny. Typický hrubý odhad naznačuje přibližně 40 procentní snížení počtu řádků kódu z Javy do Kotlinu.

$config[zx-auto] not found$config[zx-overlay] not found