Фишки Kotlin в Java

Язык Kotlin известен своим синтаксическим сахаром (чем он по большей части и является). Сегодня мы рассмотрим одну особенность этого языка и попробуем сделать то же самое в языке Java.

Для начала рассмотрим обычный класс на Kotlin.

Обычный класс с 2 параметрами, которые помечены как final, но у которых есть дефолтные значения (defaultName, 0). Это значит, что в Kotlin не нужно указывать все параметры, как если бы мы делали в Java. Давайте посмотрим на это чтобы понимать о чем речь.

Сначала мы создаем объект без параметров и выводим данные в консоль. Значит поля класса будут иметь дефолтные значения. После чего мы попытаемся задать параметры и опять выведем в консоль. Трудность в Java в том, что мы должны указать или все параметры (а их может быть сколько угодно) или нисколько. Итак, вывод будет такой.

А теперь посмотрим на возможности языка Kotlin на том же примере.

Здесь мы видим, что можем создать объект нашего класса передавая тот параметр, который мы хотим, остальные, которые не указаные явно будут иметь дефолтное значение. Т.е. я могу создать объект с первым или со вторым параметром или же как и в Java с обоими (тогда не нужно указывать имя параметра как и в Java).

Посмотрим что выводится в консоль в этом случае.

Явно указанный параметр и дефолтное значение.
Дефолтное значение и явно указанный параметр.
И случай с аналогией с Java.

Теперь, как бы выглядел тот же класс в Java? Как-то так:

Т.е. для 2 параметров нам бы понадобилось 4 конструктора со всеми вариантами.

Посмотрим использование аналогично котлиновскому классу.

И вывод в консоль аналогично будет таковым как и в котлиновском классе.

Обход трудностей в Java.

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

Итак, у нас поля не являются final, они имеют изначальное дефолтное значение. У нас есть как и конструктор со всеми параметрами (если хотите указать все сразу) и пустой конструктор. Интерес здесь представляют сеттеры, суть их в том, что они сначала проверяют значение поля на равенство дефолтному и только после этого сетят новое значение. Т.е. если вы устанавливаете значение поля первый раз, то проверку пройдет в сеттере и новое значение удачно будет проставлено полю, НО если вы попытаетесь установить значение второй раз и дальше, то проверку оно не пройдет, так как в поле уже будет иное значение нежели дефолтное. Этой проверкой мы гарантируем простановку значения лишь 1 раз.

Давайте протестируем и убедимся в этом. Junit4 тест.

Если его запустить, то он пройдет все проверки. Сетим первое значение и проверяем, что у объекта оно установилось, после чего сетим новое значение и проверяем, что оно не изменилось.

Итак, мы сымитировали фишку Kotlin.

Запись опубликована в рубрике Программирование Java. Добавьте в закладки постоянную ссылку.