Статьи

Я нашел мой Java Remake!

Еще в январе я написал пост о некоторых изменениях, которые я хотел бы видеть в языке Java, которые бы сделали его мне намного более привлекательным (и сделали бы его более современным). Многие люди предлагали много языков JVM, но я в основном отказался от них, потому что это не то, что я искал. Я хотел, чтобы Java отличалась этими способами, так как я вряд ли смогу убедить свое рабочее место позволить мне использовать что-то кроме Java. Кроме того, у большинства предлагаемых языков JVM есть некоторые синтаксические идеи, которые мне просто трудно понять.

Но…

Но потом я нашел Котлина. Это язык JVM, созданный JetBrains, создателями IntelliJ, PyCharm и нескольких других IDE и инструментов. По большей части я чувствую, что эти парни читают мои мысли о том, что я хотел от моего языка. Они пропустили несколько вещей на моем посту, но у них есть так много вещей, о которых я забыл или даже не думал.

Сравнение с моим старым списком

Сначала мы сравним то, что они сделали, а чего не имели, со списком в моем старом посте.

Избавиться от точки с запятой

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

Удалить фигурные скобки

К сожалению, они этого не сделали. Я буду жить

Перегрузка оператора

Да, у них есть перегрузка оператора и многое из этого. В отличие от Python, у них есть оператор увеличения и уменьшения, положительный и отрицательный маркер и оператор отрицания (например, __bool__() python, но с автоматическим переводом на противоположное. У них также есть оператор для создания диапазона объектов ( 1..3 ), но оба числа предназначены для включения в Kotlin, который, хотя часто и легче для чтения, большую часть времени делает для более промежуточных вычислений, поэтому многие языки предпочитают делать конец эксклюзивным.

Наконец, вы определяете свои собственные «операторы», но они должны быть логическими инфиксными операторами. На самом деле вы не определяете свои собственные операторы в той степени, в какой язык обеспечивает небольшой синтаксический сахар при вызове методов с одним параметром. Любой метод md объекта a при вызове с параметром b (т. a.md(b) ) можно записать более просто как a md b .

Кортежи и / или структуры данных

В некотором смысле, у Kotlin есть оба из них, но в некотором смысле это не имеет ни того, ни другого.

У них есть класс с именем Pair , который можно использовать как 2-кортеж, и у них есть хорошая синтаксическая сахарная система для превращения практически любого класса в именованный кортеж. Вы можете ссылаться на поля через их позиции или через имя поля. Для получения дополнительной информации ознакомьтесь с их документацией о мульти-декларациях .

Что касается Data Structures, они пошли по пути «классы со свойствами», что прекрасно и просто. Но действительно хорошая вещь об их классах структуры данных — простота их определения. Примером объявления является data class User(val name: String, val age: Int) . Это не только устанавливает все свойства для вас, но также автоматически определяет equals() , hashCode() , toString() (в форме "User(name=John, age=42)" ) и специальную copy() функция, которая обсуждается здесь .

свойства

Котлин, безусловно, обладает свойствами. На самом деле, использовать свойства проще, чем иметь простое открытое поле. Их свойства автоматически создают для вас вспомогательное поле с тем же именем, что и у свойства, но с начальным подчеркиванием.

По умолчанию для public

Когда дело доходит до методов, это так, и я рад. Ура!

Тип объектов

Да, они удалили прямой доступ к примитивам, и вы используете только объекты типа (и сделали его более безопасным, чем обычно, из-за их практики нулевой безопасности, о которой я расскажу чуть позже.

Список, словарь и набор литералов

Увы, Котлин не делал коллекционные литералы. «Это печально, но, с некоторыми функциями в Kotlin, вы, вероятно, могли бы создать действительно простые способы встроить их создание.

Вещи, которые я забыл о

Это пара вещей, которые я знал, что хотел бы на Java, но забыл вставить в старый пост

Выражения потока управления

Мне нравится, когда структуры потока управления на языке могут быть преобразованы в выражение (возвращает значение). Конечно, Java (и многие другие языки) имеют троичный оператор, который позволяет почувствовать, что блок if-else является выражением, но он ограничен одной проверкой «если». Он не допускает блоки «else if» без трудно читаемой вложенности.

Но Котлин не останавливается, если блоки; они также делают выражения try-catch и выражения «когда» (объясняется в следующем разделе). Поскольку выражение try-catch является выражением, вы можете сократить некоторые назначения, для которых требуется блок try-catch вокруг вычисления. Так что вместо

1
2
3
4
5
6
7
8
9
Integer a;
try
{
   a = Integer.parseInt(input);
}
catch(NumberFormatException e)
{
   a = null;
}

Вы могли бы просто напечатать

1
2
3
Integer a =
   try { Integer.parseInt(input); }
   catch (NumberFormatException e) { null; }

Очевидно, вам не нужно использовать их как выражения. Вы все еще можете использовать их старомодным способом, сколько хотите.

Сопоставление с образцом

Выражение «когда» было упомянуто ранее, но теперь мы действительно будем копаться. Оно используется в Kotlin для сопоставления с образцом и заменяет блоки switch-case более упорядоченным синтаксисом, который также может работать как выражение if-else, но с более широким использованием. Он может функционировать аналогично для переключения блоков в том смысле, что он может переходить к следующему «случаю», но это должно быть сделано с помощью явной команды continue (пора, что по умолчанию для «переключателя» является НЕ продолжать поток, но даже это не так. не требуется столько, сколько обычно, так как вы можете просто разделить несколько возможностей через запятую, чтобы все они использовали одну и ту же ветку. Проверьте это здесь .

Это не совсем сопоставление с образцом, как его определяют некоторые функциональные языки, но это лучшее, что вы можете сделать в ОО-языках, насколько я могу судить. Мне также грустно сообщать, что, несмотря на приличное сопоставление с образцом, которое отлично подходит для рекурсивных функций, у Kotlin, похоже, нет оптимизации Tail Call Optimization. Еще(?). Котлин еще довольно молод. Может быть, это будет где-то вниз по линии.

Расширения класса

Нет проверенных исключений

Я, конечно, не возражаю против создания объявлений о возможных исключениях и, возможно, предупреждения компилятора, дающего нам знать, что мы не имеем дело с объявлением о возможном исключении или не объявляем его, но я, конечно, не хочу, чтобы нас заставляли «иметь дело с Исключения, которые на самом деле не будут выброшены. Итак, я рад, что у Котлина их нет.

Именованные и стандартные параметры

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

Вещи, которые я никогда не осознавал

Теперь я перечислю некоторые из самых крутых вещей, которые Котлин предлагает, и я бы даже не подумал, что это хорошая идея.

Нулевая безопасность

Объект не может быть установлен в нуль, если его тип не указывает, что это ноль. В Kotlin и объект типа List не может быть нулевым, но, если он имеет тип List? , он может. Это, наряду с некоторыми простыми синтаксисами, которые позволяют вам безопасно работать с обнуляемыми объектами, работает, чтобы сделать намного более приятный язык для работы, почти исключая возможность NPE.

Функции как выражения

Этот не большой, но он может уменьшить простые функции, чтобы занимать меньше места разборчивым способом. Если тело функции — это просто одно выражение (будь то простое или сложное, например, выражение «когда»), вы можете пропустить фигурные скобки, окружающие тело, и вместо этого поставить перед = . Например это:

1
2
3
4
fun powerOf(number: Int, exponent: Int): Int
{
   return Math.pow(number, exponent)
}

может стать таким вместо:

1
fun powerOf(number: Int, exponent: Int): Int = Math.pow(number, exponent)

Это не имеет большого значения, но мне нравится, что оно не только позволяет вам отключить скобки для = , но также позволяет пропустить использование оператора return.

Outro

Вот что я люблю в Котлине. Вы должны проверить это на их официальной странице и сообщить мне, что вы об этом думаете. Я очень взволнован этим и планирую переключиться на него после того, как я закончу с моим текущим проектом, о котором вы можете услышать немного о моем посте на следующей неделе.

Ссылка: Я нашел мой Java Remake! от нашего партнера JCG Джейкоба Циммермана в блоге « Идеи программирования с Джейком» .