Вышел Kotlin M5

в 16:00, , рубрики: java, kotlin, Блог компании JetBrains, метки:

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

Сегодня мы выпустили очередной milestone: Kotlin M5. Этот пост дает краткое описание изменений, вошедших в 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 можно скачать из репозитория плагинов, рекомендуется использовать недавно вышедшую IntelliJ IDEA 12.0.3.

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

Автор: abreslav

Источник

Поделиться

* - обязательные к заполнению поля