Рубрики
Без рубрики

#Обучениекотлину Часть 1 – Классы, предметы и все, что между ними

Классы в Kotlin в точности имитируют свои Java-аналоги в реализации, с некоторыми важными изменениями… С тегом kotlin, java, android.

#Обучениекотлину (Серия из 4 частей)

Классы в Kotlin в точности имитируют свои Java-аналоги в реализации, с некоторыми важными изменениями, которые я попытаюсь описать здесь.

Давайте объявим два идентичных класса в Kotlin и Java в качестве отправной точки. Мы будем вносить в них изменения, чтобы показать, как разные шаблоны реализованы на двух языках.

Ява:

class Person {
  private final String name;

  public Person(String name) {
    this.name = name;
  }
}

Котлин:

class Person(val name: String)

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

Конструкторы и параметры

Kotlin использует очень компактный синтаксис для описания первичных конструкторов. С помощью некоторых хитрых трюков со значениями по умолчанию мы можем создать множество конструкторов из одного!

Обратите внимание на значение в имени параметра. Это краткий синтаксис для объявления переменных и их инициализации из самого конструктора. Как и любое другое свойство, они могут быть изменяемыми ( var ) или неизменяемыми ( val ). Если вы удалите телятину в нашем конструкторе Person , у вас не будет переменной name , доступной в ее экземпляре, т.е. Person("Персона 1"). имя не будет разрешено.

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

class Person(val name: String) {
  init {
    println("Invoking constructor!")
  }
}

val _ = Person("Matt")

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

Ява:

class Person {

  private final String name;
  private int age = 18;

  public Person(String name) {
    this.name = name;
  }

  public Person(String name, int age) {
    this(name);
    this.age = age;
  }

  @Override
  public String toString() {
    return + name + + Integer.toString(age);
  }
}

Котлин:

class Person(val name: String, val age: Int = 18) {
  override fun toString() : String {
    // I'll go over string templates in a future post, hold me to it :)
    return "Name=$name,age=$age"
  }
}

Здесь много нового! Давайте разберем их по полочкам.

В Kotlin есть функция под названием “параметры по умолчанию”, которая позволяет указывать значения параметров по умолчанию, делая их необязательными при создании экземпляра класса.

Давайте рассмотрим это для repl.it !

Оба работают отлично, но вы знаете, какой из них вам больше понравится писать;)

Здесь важно отметить, что конструкторы со значениями по умолчанию напрямую не работают с Java, если вы пишете библиотеку или любой код, который потребует взаимодействия с Java. Используйте Kotlin @JvmOverloads для загрузки я постараюсь сделать это за вас.

class Person @JvmOverloads constructor(val name: String, val age: Int = 18) {
  override fun toString() : String {
    return "Name=$name,age=$age"
  }
}

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

Окончание занятий

В Kotlin все классы по умолчанию являются окончательными и не могут быть унаследованы, в то время как Java по умолчанию использует расширяемые классы. Ключевое слово open помечает классы Kotlin как расширяемые, а ключевое слово final делает обратное на Java.

Ява:

public class Man extends Person { /* Class body */ } // Valid in Java

Котлин:

class Man(val firstName: String) : Person(firstName) // Errors!

Пробуем это в Kotlin ЗАМЕНИТЬ с

>>> class Person @JvmOverloads constructor(val name: String, val age: Int = 18) {
...   override fun toString() : String {
...     return "Name=$name,age=$age"
...   }
... }
>>> class Man(val firstName: String) : Person(firstName)
error: this type is final, so it cannot be inherited from
class Man(val firstName: String) : Person(firstName)
                                   ^

Имеет смысл, так как это по умолчанию для Kotlin. Давайте добавим открыть ключевое слово к нашему определению Человек и повторите попытку.

>>> open class Person @JvmOverloads constructor(val name: String, val age: Int = 18) {
...   override fun toString() : String {
...     return "Name=$name,age=$age"
...   }
... }
>>> class Man(val firstName: String) : Person(firstName)
>>> println(Man("Henry"))
Name=Henry,age=18

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

Статические классы утилит

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

Вот небольшая функция, которую я использую для преобразования путей URI Android в удобочитаемые версии.

Ява:

public static final class StringUtils {
  public static String normalizePath(final String str) {
    return str.replace("/document/primary:", "/sdcard/");
  }
}

Котлин:

object StringUtils {
  // I'll cover this declaration style too. It's just the first post!
  fun normalizePath(str: String): String = str.replace("/document/primary:", "/sdcard/")
}

Повторяющийся шаблон с Kotlin – это сжатый код, как вы можете видеть в этом случае.

Вот и все для этого! Дайте мне знать в комментариях о том, о чем вы предпочли бы написать на следующей неделе, или если вы чувствуете, что я что-то пропустил в этом, и я обязательно постараюсь это сделать:)

#Обучениекотлину (Серия из 4 частей)

Оригинал: “https://dev.to/msfjarvis/teachingkotlin-part-1-classes-and-objects-and-everything-in-between-5bn0”