Мысли о 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.