четвер, 20 липня 2017 р.

Kotlin. Часть 2. Незнакомые конструкции

Вот и наступил тот момент, когда вы познакомитесь с незнакомыми конструкциями в Kotlin. Эта статья является логическим продолжением Kotlin. Часть 1. Введение и её задача познакомить вас с конструкциями языка, которые могут быть крайне не привычны Java программисту. Нужно отметить, что если вы работали, например, с Groovy, то какие-то моменты вам могут быть до боли знакомы, но мы их всё равно рассмотрим. Те вещи, которые мы рассмотрели в предыдущей статье, затрагивать не будем. Если вы не прочитали предыдущую статью, рекомендую, для начала, прочитать её.

Современное лого Котлина

Для любителей проверить код

Чтобы создать простой проект на Kotlin - вам понадобится Intellij Idea Community Edition 2017 года. Скачать можно здесь. Если вы хотите полный туториал по хеллоу ворлду, то его можете прочитать и здесь, но я расскажу кратко как создать Kotlin проект с использованием системы сборки Gradle через Intellij Idea.

File -> New -> Project... -> Gradle -> Выбрать Kotlin (Java) и указать Project SDK, если не определен -> Next -> groupId и artifactId в данном случае не имеют значения, любые -> Next -> Ставим галку около Create directories... -> Next -> задаем нужный project name -> Finish

Готово! В папке src/main/kotlin вы можете писать на Kotlin.

First-class функции

В первую очередь то, что бросается в глаза это функции, которые можно писать вне классов. Типичный Hello World проект выглядит так:

fun main(args: Array<String>) {
    println("Hello World")
}

Это весь код, который нужно написать. Метод запускается без какого либо класса.

Нет ключевого слова new

Здесь всё просто, если вы хотите создать объект, вы не используете new, а просто вызываете конструктор, например:

val set = HashSet<String>()

Классы Any, Array

В Котлине вы можете встретить несколько, а может быть и много, не знакомых классов. Краткое описание парочки таких ниже:

  • Any - местный аналог Object из которого вырезали кучу методов, например wait и notifyAll. Вы можете использовать Object, при глубокой необходимости, но часто этой проблемы нет.
  • Array - специальный класс, для работы с массивами. new MyClass[5] - конструкции в Котлине нет.

Mutable и Immutable коллекции

Вероятно, что вы помните из прошлой статьи, что переменные могут быть mutable и immutable благодаря var или val модификатору. Однако, если переменная является коллекцией, то на этот случай тоже есть свой хак. Интерфейсы List, Set, Map (Queue там нет, видимо за отсутствием смысла в неизменяемых очередях, почти как на почте) из пакета kotlin.collections - immutable, т.е. в них нет методов, которые могут изменить коллекцию, например, add для списка или put для мапы. Если вы хотите изменяемую коллекцию, то можете использовать MutableSet, MutableMap или MutableList. Таким образом вы можете декларировать можно ли менять коллекцию, которая возвращается из метода, еще на этапе компиляции, а не бросать exception во время выполнения.

Data класс

В Котлине, есть специальный модификатор, благодаря которому компилятором генерируются методы equals, hashcode, toString, copy и componentN.

data class User(val name: String)

Классы по умолчанию public final

В первую очередь, если вы джавист, создав новый класс вы привыкли видеть "public class ...", здесь этого нет. Все классы по умолчанию public и final. Для того чтобы наследоваться от класса, вам нужно явно прописать модификатор open или abstract (в этом случае open подразумевается и не требуется).

Void -> Unit

Когда ваш метод не возвращает значение в Java вы пишите void в декларации метода, в Kotlin вы не пишите ничего, но в голове держите, что возвращается Unit. Это эдакая альтернатива.

Класс Nothing

Этот класс не имеет инстансов и его объявление в декларации метода как возвращаемого типа означает, что метод всегда бросает exception.

Операторы

Появился модификатор operator благодаря которому, вы можете делать собственные реализации для +, - и так далее.

Лямбды

Объявление самого простого варианта лямбды выглядит следующим образом:

() -> Unit

Здесь я привожу это для того, чтобы вы понимали с чем столкнулись, а больше подробностей о работе с лямбдами будет в последней статье серии о Kotlin.

Что я специально пропустил

Следующие вопросы я специально оставил для вашего изучения:

  • Sealed class;
  • как метод componentN улучшает читаемость кода;
  • Generics - это очень специфичная тема и для неё нужно отдельную статью;
  • модификатор infix и lambda with receiver будут рассмотрены в последней статье цикла;
  • местная альтернатива Stream API в Java - будет рассмотрена в следующей статье;

И, обязательно, я что-то пропустил не специально.

Заключение

Дочитав до этих строк, вероятно, вам стало чуть легче ориентироваться в Kotlin. Естественно, здесь не было всех подробностей, но, надеюсь, что эта статья дала вам возможность не пугаться этого языка и попробовать что-то самостоятельно на нем сделать. В следующий раз я расскажу о том, как взять свой Java проект и полностью или частично мигрировать его на Kotlin.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments