Pull to refresh
0
JetBrains
Делаем эффективные инструменты для разработчиков

Вышел Kotlin M5

Reading time 2 min
Views 7.8K
Скоро год как мы открыли исходный код 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) из Kotlin виден как foo(ArrayList<String?>?), то есть как сам список может быть null, так и любой его элемент. Этот подход наиболее безопасен, однако с ним возникает такая проблема: если где-то в Kotlin у меня уже есть ArrayList, я не могу передать его методу foo(), потому что класс ArrayList ивариантен, и типы не сходятся. Эта проблема сильно мешает жить, поэтому мы пошли на компромисс: теперь Kotlin не делает аргументы generic-типов nullable, то есть foo() будет загружен как
foo(ArrayList?) и передать туда список обычных строк будет можно.

Теперь из 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 можно почитать здесь (по-английски). Приятного Котлина!
Tags:
Hubs:
+11
Comments 14
Comments Comments 14

Articles

Information

Website
jetbrains.com
Registered
Founded
Employees
1,001–5,000 employees
Location
Чехия