Мысли о Kotlin. Зачем переходить? Какой профит?

1. 

  • про NPE в рантайме можно забыть
  • можно расширять стандартные классы из SDK
  • можно лямбды и анонимные функции писать
  • передавать функции как параметры в методы

Kotlin на 100% совместим с Java, и плагин позволяет java-код в один клик трансформировать в kotlin-код. Из-за этого новая TestActivity на Kotlin спокойно наследуется от AppCompatActivity, которая лежит в Support Library, а не в SDK.

2. 

Теперь проверим, как это сработает на обычном дата-классе:

public class Message {
   private String text;
   private boolean isRead;

   public Message(String text, boolean isRead) {
       this.text = text;
       this.isRead = isRead;
   }

   public String getText() {
       return text;
   }

   public boolean isRead() {
       return isRead;
   }
}

и конвертнем его в kotlin-файл:

class Message(val text: String, val isRead: Boolean)

Одна строка кода по сравнению с 14-ю в Java-варианте! А если еще перед описанием класса добавить data, то автоматом получаем возможность делать копии объектов с помощью метода copy(). В качестве параметров он может принимать новые значения полей объекта. Запишите еще очко в пользу Kotlin.

3.

А также:

  • для создания экземпляра класса нам не нужно ключевое слово new;
  • никаких тебе extends или implements, для этого теперь используется «:»;
  • класс может иметь один primary constructor и один/несколько secondary constructors;
  • у primary constructor нет тела, но внутри него можно описать блок инициализации init;
  • используются ключевые слова var (mutable property)/val (read-only property) для декларации и инициализации properties прямо в объявлении конструктора. Ключевые слова val\var используются и при объявлении обычных локальных переменных;
  • OMG!, здесь есть named arguments и дефолтные значения для них;
  • можно описывать кастомные accessors — круть! очень полезная штука;
  • теперь не нужно явно вызывать getter/setter для получения/присвоения значения проперти — обращение происходит просто по имени — тоже здОрово!
  • по умолчанию область видимости для классов/методов/пропертей — public;
  • по умолчанию все классы в Kotlin final и нужно использовать open-аннотацию для класса, если необходимо иное поведение — к этому придется немного привыкать;
  • интерфейсы теперь могу реализовывать методы!!! Т.е. класс может имплементить два интерфейса, которые имеют различную реализацию метода с одинаковой сигнатурой, и я смогу выбрать, где какой из методов использовать. Вот это реально круто! Очень давно об этом мечтал;
  • вариативность женериков (generics) реализована с помощью in/out-кейвордов;
  • реализовать anonymous inner classes можно через object expressions & object declarations;
  • всеми любимый Singleton легко и просто реализуется с помощью object declaration;
  • Java static methods == object declaration + companion object;
  • делегирование реализовано на уровне декларации класса с помощью by-clause, компилятор сам сгенерирует необходимые дублирующие методы — любители делегирования возрадуйтесь, теперь не нужно дублировать вручную методы!

4.

Можно взять java-код и скопипастить его в kotlin-файл и IDE сама предложит его конвертнуть. Кстати, на Java можно и в kotlin-файлах спокойно писать код, и все будет работать — это как еще один бонус 100%-й совместимости. Там же с помощью IDE полученный код можно упростить и привести его к kotlin-style.