Какво е Kotlin? Обяснена е алтернативата на Java

Kotlin е безплатен, с отворен код, статично въведен „прагматичен“ език за програмиране с общо предназначение, първоначално проектиран за JVM (Java Virtual Machine) и Android, който съчетава обектно-ориентирани и функционални функции за програмиране. Той е фокусиран върху оперативната съвместимост, безопасността, яснотата и поддръжката на инструментите. Производят се и версии на Kotlin, насочени към JavaScript ES5.1 и родния код (използващ LLVM) за редица процесори.

Kotlin възниква в JetBrains, компанията, която стои зад IntelliJ IDEA, през 2010 г. и е с отворен код от 2012 г. В момента екипът на Kotlin има повече от 90 щатни членове от JetBrains, а проектът Kotlin в GitHub има повече от 300 участници. JetBrains използва Kotlin в много от своите продукти, включително флагмана си IntelliJ IDEA.

Kotlin като по-кратък език на Java

На пръв поглед Kotlin изглежда като по-кратка и рационализирана версия на Java. Помислете за екранната снимка по-горе, където автоматично преобразувам пример за код на Java (вляво) в Kotlin. Забележете, че безсмисленото повторение, присъщо на инстанцирането на Java променливи, е изчезнало. Идиомът на Java

StringBuilder sb = нов StringBuilder ();

Става в Котлин

val sb = StringBuilder ()

Можете да видите, че функциите се дефинират с funключовата дума и че точките с точка и запетая вече не са задължителни, когато присъстват нови редове. В valключова дума декларира имот само за четене или локална променлива. По същия начин varключовата дума декларира изменяемо свойство или локална променлива.

Въпреки това, Kotlin е силно написан. В valи varключови думи, може да се използва само когато видът може да се заключи. В противен случай трябва да декларирате типа. Изводът за тип изглежда се подобрява с всяко издание на Kotlin.

Погледнете декларацията за функция в горната част на двете панели. Типът връщане в Java предшества прототипа, но в Kotlin той наследява прототипа, обозначен с двоеточие като в Pascal.

Не е напълно очевидно от този пример, но Kotlin смекчи изискването на Java функциите да бъдат членове на класа. В Kotlin функциите могат да бъдат декларирани на най-високо ниво във файл, локално вътре в други функции, като функция член в клас или обект и като функция за разширение. Функциите за разширение осигуряват подобна на C # възможност за разширяване на клас с нова функционалност, без да се налага да наследявате от класа или да използвате какъвто и да е модел на дизайн, като Decorator.

За феновете на Groovy Kotlin прилага строители; всъщност строителите на Kotlin могат да бъдат проверени. Kotlin поддържа делегирани свойства, които могат да се използват за внедряване на мързеливи свойства, наблюдаеми свойства, свойства, които могат да се набелязват, и картографирани свойства.

Много асинхронни механизми, налични на други езици, могат да бъдат внедрени като библиотеки, използващи Kotlin съпрограми. Това включва async/ awaitот C # и ECMAScript, канали и изберете от Go, и generators/ yieldот C # и Python.

Функционално програмиране в Kotlin

Разрешаването на функции от най-високо ниво е само началото на историята на функционалното програмиране за Kotlin. Езикът също така поддържа функции от по-висок ред, анонимни функции, ламбда, вградени функции, затваряния, рекурсия на опашката и генерични лекарства. С други думи, Kotlin притежава всички характеристики и предимства на един функционален език. Например, разгледайте следните функционални идиоми на Kotlin.

Филтриране на списък в Kotlin

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

За още по-кратък израз използвайте, itкогато има само един параметър във функцията ламбда:

val pozitiv = list.filter {it> 0}

Преминаване по карта / списък на двойки в Kotlin

за ((k, v) в карта) {println (“$ k -> $ v”)}

kи v може да се нарече каквото и  да било.

Използване на диапазони в Kotlin

за (i в  1..100) {...} // затворен диапазон: включва 100

за (i в  1 до 100) {...} // полуотворен диапазон: не включва 100

за (x в  2..10 стъпка 2) {...}

за (х в  10 надолу До 1) {...}

ако (x в  1..10) {...}

Горните примери показват  for ключовата дума, както и използването на диапазони.

Въпреки че Kotlin е пълноправен език за функционално програмиране, той запазва по-голямата част от обектно-ориентираната природа на Java като алтернативен стил на програмиране, което е много удобно при конвертиране на съществуващ Java код. Kotlin има класове с конструктори, заедно с вложени, вътрешни и анонимни вътрешни класове, и има интерфейси като Java 8. Kotlin е не да има newключова дума. За да създадете екземпляр на клас, извикайте конструктора точно като обикновена функция. Видяхме това на екранната снимка по-горе.

Kotlin има единично наследяване от посочен суперклас и всички класове Kotlin имат суперклас по подразбиране Any, който не е същият като базовия клас Java java.lang.Object. Anyсъдържа само три предварително дефинирани член функции: equals(), hashCode(), и toString().

Класовете Kotlin трябва да бъдат маркирани с openключовата дума, за да позволят на други класове да наследят от тях; Java класовете са нещо като обратното, тъй като са наследствени, освен ако не са маркирани с finalключовата дума. За да замени метод на суперклас, самият метод трябва да бъде маркиран openи методът на подкласа трябва да бъде маркиран override. Всичко това е парче с философията на Котлин да прави нещата явни, вместо да разчита на подразбиране. В този конкретен случай мога да видя къде начинът на Kotlin да маркира изрично членовете на базовия клас като отворени за наследяване и производни членове на класа като замества избягва няколко вида често срещани грешки в Java.

Функции за безопасност в Kotlin

Говорейки за избягване на често срещани грешки, Kotlin е проектиран да премахне опасността от препратки към нулеви указатели и да рационализира обработката на нулеви стойности. Това се прави, като се прави nullнезаконно за стандартни типове, добавя се зануляващи типове и се прилагат нотации за бърз достъп за обработка на тестове за нула.

Например, обикновена променлива от тип  не може да съдържа  :String null

var a: String = "abc"

a = null // грешка при компилация

Ако трябва да разрешите нули, например да съхранявате резултати от SQL заявки, можете да декларирате зануляван тип, като добавите въпросителен знак към типа, напр String?.

var  b: Низ?

b = нула  // добре

Защитите отиват малко по-далеч. Можете да използвате безнаказан тип безнаказано, но трябва да тествате нулируем тип за нулеви стойности, преди да го използвате.

За да се избегне многословната граматика, която обикновено е необходима за нулево тестване, Kotlin въвежда безопасно повикване , написано ?.. Например връща, ако не е , и в противен случай. Типът на този израз е .b?.length b.lengthbnullnullInt?

С други думи, това b?.lengthе пряк път за if (b != null) b.length else null. Този синтаксис се свързва добре, като елиминира доста логика на проликс, особено когато обект е попълнен от поредица от заявки към база данни, всяка от които може да е неуспешна. Например bob?.department?.head?.nameби върнал името на началника на отдела на Боб, ако Боб, отделът и ръководителят на отдела не са нула.

За да извършите определена операция само за ненулеви стойности, можете да използвате оператора за безопасно повикване ?.заедно с  let:

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

за (елемент в listWithNulls) {

      артикул? .let {println (it)} // отпечатва A и игнорира null}

Често искате да върнете валидна, но специална стойност от израз, който може да се обезсмисли, обикновено за да можете да го запишете в ненулируем тип. За това има специален синтаксис, наречен оператор Елвис (аз не се шегувам), написан ?:.

val l = b? .дължина?: -1

е еквивалент на 

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

В същия дух Kotlin пропуска проверените изключения на Java, които са условия за хвърляне, които трябва да бъдат уловени. Например подписът JDK

Приложимо добавяне (CharSequence csq) изхвърля  IOException;

изисква да хващате IOExceptionвсеки път, когато извикате appendметод:

опитвам {

  log.append (съобщение)

}

catch (IOException e) {

  // Направете нещо с изключение

}

Дизайнерите на Java смятат, че това е добра идея и това е чиста печалба за програми за играчки, стига програмистите да внедрят нещо разумно в catchклаузата. Твърде често в големи програми на Java, обаче, ще видите код, в който задължително catchклауза съдържа нищо друго освен своя коментар: //todo: handle this. Това не помага на никого и проверените изключения се оказаха чиста загуба за големи програми.

Котлин съпрограми

Програмите в Kotlin са по същество леки нишки. Започвате ги с launchконструктора на съпрограми в контекста на някои CoroutineScope. Един от най-полезните обхвати на съпрограмата е runBlocking{}, който се отнася за обхвата на неговия кодов блок.

импортирайте kotlinx.coroutines. *

fun main () = runBlocking {// това: CoroutineScope

    стартиране {// стартиране на нова съпрограма в обхвата на runBlocking

        закъснение (1000L) // неблокиращо закъснение за 1 секунда

        println ("Свят!")

    }

    println ("Здравей,")

}

Този код произвежда следния изход със закъснение от една секунда между редовете:

Здравейте,

Свят!

Kotlin за Android

До май 2017 г. единствените официално поддържани езици за програмиране за Android бяха Java и C ++. Google обяви официална поддръжка на Kotlin за Android на Google I / O 2017, а като се започне с Android Studio 3.0 Kotlin е вграден в инструментариума за разработка на Android. Kotlin може да се добави към по-ранните версии на Android Studio с приставка.

Kotlin се компилира в същия байтов код като Java, взаимодейства с Java класове по естествени начини и споделя инструментите си с Java. Тъй като няма разходи за разговори между Kotlin и Java, добавянето на Kotlin постепенно към приложение за Android в момента е напълно логично. Няколко случая, при които на оперативната съвместимост между Kotlin и Java кода липсва изящество, като например свойства, зададени само за Java, рядко се срещат и лесно се поправят.

Pinterest беше детето на плаката за приложения за Android, написано в Kotlin още през ноември 2016 г., и беше споменато на видно място в Google I / O 2017 като част от съобщението на Kotlin. В допълнение, екипът на Kotlin обича да цитира приложенията на Evernote, Trello, Square и Coursera за Android.

Kotlin срещу Java

Въпросът дали да се избере Kotlin или Java за ново развитие се появява много в общността на Android от обявяването на I / O на Google, въпреки че хората вече задаваха въпроса през февруари 2016 г., когато Kotlin 1.0 беше изпратен. Краткият отговор е, че Kotlin кодът е по-безопасен и по-кратък от Java кода и че Kotlin и Java файловете могат да съществуват едновременно в приложения за Android, така че Kotlin е полезен не само за нови приложения, но и за разширяване на съществуващи Java приложения.

Единственият убедителен аргумент, който видях за избора на Java пред Kotlin, би бил за случая на пълни начинаещи разработчици на Android. За тях може да има пречка за преодоляване, тъй като в исторически план повечето документация и примери за Android са в Java. От друга страна, конвертирането на Java в Kotlin в Android Studio е прост въпрос за поставяне на Java кода във файл Kotlin.

За почти всеки друг, който се занимава с разработка на Android, предимствата на Kotlin са убедителни. Типичното време, за което разработчик на Java трябва да научи Kotlin, е няколко часа - малка цена, която трябва да се плати, за да се премахнат нулевите референтни грешки, да се активират функциите за разширение, да се поддържа функционално програмиране и да се добавят съпрограми. Типичната груба оценка показва приблизително 40% намаляване на броя на редовете код от Java до Kotlin.