- PVSM.RU - https://www.pvsm.ru -

Вышел Kotlin M5

Скоро год как мы открыли его исходный код Kotlin [1]. За это время проделана большая работа, в которой активно участвовали как разработчики из JetBrains, так и представители комьюнити. Нам пришло 164 pull requests [2], то есть что-то около одного патча каждые два дня.

Сегодня мы выпустили очередной milestone: Kotlin M5 [3]. Этот пост дает краткое описание изменений, вошедших в M5.

Конструкторы по умолчанию

Класс, написанный на Kotlin может иметь только один конструктор. Перегружать конструкторы незачем, поскольку есть значения по умолчанию для параметров:

class Foo(val bar: Int = 0)

Однако многие Java-фреймворки, например, JAXB, требуют, чтобы у класса был конструктор по умолчанию, то есть без параметров. Теперь Kotlin генерирует такой конструктор, если все параметры могут быть опущены.

Inner-Классы

Начиная с M5, Kotlin поддерживает не только inner-классы, но и «статические» nested-классы. Поскольку объект inner-класса хранит ссылку на объект объемлющего класса, что может приводить к неожиданным последствиям (например, к утечкам памяти), Kotlin требует явно помечать inner-классы соответствующей аннотацией:

class Outer {
  val foo = 1
  inner class Inner {
    val bar = foo + 1
   }
}

Generics, Nullability, Assertions

Kotlin различает nullable и not-null ссылки на уровне системы типов. Поскольку в Java для ссылок нет никаких гарантий того, что они не равны null, Kotlin загружает все непримитивные типы как nullable. Например, Java-метод foo(ArrayList<String>) из Kotlin виден как foo(ArrayList<String?>?), то есть как сам список может быть null, так и любой его элемент. Этот подход наиболее безопасен, однако с ним возникает такая проблема: если где-то в Kotlin у меня уже есть ArrayList, я не могу передать его методу foo(), потому что класс ArrayList ивариантен, и типы не сходятся. Эта проблема сильно мешает жить, поэтому мы пошли на компромисс: теперь Kotlin не делать аргументы генерических типов nullable, то есть foo() будет загружен как foo(ArrayList<String>?) и передать туда список обычных строк будет можно.

Теперь из Java-кода легче «сломать» программу на Kotlin, вызвав NPE, однако компилятор Kotlin делает все возможное, чтобы такие ошибки было легко искать: в байт-код вставляются соответствующие проверки, и некорректное значение будет обнаружено как только оно попадет из Java-кода в Kotlin-код:

Exception in thread "main" java.lang.IllegalStateException:
    Method specified as non-null returned null: JavaClass.foo
    at _DefaultPackage.main(hello.kt:4)

Заключение

Kotlin M5 можно скачать из репозитория плагинов [4], рекомендуется использовать недавно вышедшую IntelliJ IDEA 12.0.3 [5].

Кроме описанного здесь, случилось еще много чего: от поддержки цветовой схемы Darcula [6] до возможности смешивать именованные и позиционные параметры функций. Более подробно про M5 можно почитать здесь [7] (по-английски). Приятного Котлина!

Автор: abreslav

Источник [8]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/26360

Ссылки в тексте:

[1] Kotlin: http://kotlin.jetbrains.com

[2] 164 pull requests: https://github.com/jetbrains/kotlin/pulls?page=1&sort=created&state=closed

[3] Kotlin M5: http://blog.jetbrains.com/kotlin/2013/02/kotlin-m5-is-out/

[4] репозитория плагинов: http://plugins.jetbrains.com/plugin?pr=idea&pluginId=6954

[5] IntelliJ IDEA 12.0.3: http://www.jetbrains.com/idea/download/index.html

[6] Darcula: http://blog.jetbrains.com/kotlin/files/2013/02/Darcula.png

[7] здесь: http://blog.jetbrains.com/kotlin/2013/02/kotlin-m5-is-out

[8] Источник: http://habrahabr.ru/post/168265/