Сеттеры / геттеры удалены во время конверсии Kotlin - PullRequest
0 голосов
/ 27 июня 2019

После преобразования класса модели на основе Java в Kotlin я заметил, что мои методы setter и getter были удалены. Что было когда-то,

private String apiKey;

public void setApiKey(String key) {
   this.key = key;
}

public String getApiKey() {
   return key;
}

Стала

lateinit var apiKey: String

Что именно произошло? Удалил ли он мои сеттеры и геттеры, а затем изменил модификатор доступа моей переменной с приватного на публичный? Если так, то почему и как это хорошо? Сеттеры и геттеры должны быть частью абстракции в Java. Котлин не заботится об этом?

Я все еще изучаю Kotlin, и я полагаюсь на встроенные преобразования в качестве руководства для начинающих по лучшим практикам. Это просто ситуация, когда вы не делаете сеттеры / геттеры в Котлине?

Ответы [ 3 ]

4 голосов
/ 27 июня 2019

Ваше поле + получатель / установщик были преобразованы в Свойства Kotlin .Поскольку field + getter / setter очень распространены, у Kotlin есть поддержка на высшем уровне.Может показаться, что вы получаете доступ к голому полю напрямую, но это не так.Kotlin скрывает от вас реализацию по умолчанию метода получения и установки.В большинстве случаев мы просто хотим получить или установить без какой-либо другой логики, поэтому нам не нужно это видеть.Каждый раз, когда вы получаете доступ к apiKey в Котлине, вы проходите через геттер или сеттер.

Что касается общедоступности, свойства по умолчанию являются общедоступными в Kotlin.Как предоставить свои собственные реализации get / set, а также как изменить их уровни доступа можно найти на странице, на которую я ссылался выше.

2 голосов
/ 27 июня 2019

Я рекомендую вам прочитать хорошую документацию о Kotlin, например, например property-getter-and-setter-kotlin , но я приведу вам небольшой пример ...

Это нормально, что они удалили setter и getter, они все еще там ... Дело в том, что если вы хотите override эти set и get, вы должны сделать что-то вроде:

private var apiKey: String
get() = "My apiKey is $apiKey"
set(value) {
    //Do whatever you want with apiKey
}

Итак, если вы не хотите override эти методы, вы можете просто получить к ним доступ, используя:

, если вы делаете apiKey = ..., вы используете set

если вы используете var newVar = apiKey, вы используете get метод

2 голосов
/ 27 июня 2019

Удалил ли он мои сеттеры и геттеры, а затем изменил модификатор доступа моей переменной с приватного на публичный?

Да.

Если так, то почему

Он сгенерировал идиоматический Kotlin для вашего кода.

как это хорошо?

Idiomatic Kotlin - разумный выбор по умолчанию для переводчика кода в Kotlin.

Сеттеры и геттеры являются частью абстракции в Java. Котлин не заботится об этом?

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

Предположим, что вместо этого ваш код выглядел так:

private String apiKey;

public void setApiKey(String key) {
   this.key = key.toUpperCase();
}

public String getApiKey() {
   return key;
}

Здесь установщик обеспечивает, чтобы ключ API всегда был в верхнем регистре.

Эквивалент Kotlin будет:

var apiKey: String = "THE-DUDE-ABIDES"
  set(value) { field = value.toUpperCase() }

Потребители вашего свойства apiKey всегда используют методы получения и установки. Просто синтаксически Kotlin делает вызовы геттеров и сеттеров похожими на доступ к простому полю. Таким образом, пользователям apiKey не нужно делать ничего другого, чтобы использовать переопределенный установщик (с вызовом toUpperCase()) от установщика по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...