Шаг 236.
Основы Kotlin.
Совместимость с Java. Методы свойств и совместимость
На этом шаге мы рассмотрим работу с методами свойств Java в Kotlin.
Kotlin и Java обрабатывают переменные класса по-разному. Java использует поля и обычно предоставляет доступ к ним через методы чтения и записи. Свойства в
Kotlin, как вы уже видели, ограничивают доступ к полям и автоматически предлагают методы чтения и записи.
На прошлом шаге вы добавили общедоступное поле hitPoints в Jhava. Этот пример помог продемонстрировать отображение типов, но он нарушает принципы инкапсуляции
и поэтому является не лучшим решением. В Java к полям надо обращаться или изменять их с помощью методов чтения и записи. Методы чтения используются для извлечения
данных, а методы записи - для их изменения.
Объявите поле hitPoints приватным и добавьте метод чтения, чтобы hitPoints можно было прочитать, но нельзя изменить.
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class Jhava {
private int hitPoints = 52489112;
@NotNull
public String utterGreeting() {
return "BLARGH";
}
@Nullable
public String determineFriendshipLevel() {
return null;
}
public int getHitPoints() {
return hitPoints;
}
}
Рис.1. Объявление поля в java (Jhava.java)
Вернитесь в Hero.kt. Код все еще компилируется. Мы говорили о том, что Kotlin избавляет от необходимости использовать синтаксис вызова методов чтения/записи. Это
означает, что вы можете использовать синтаксис, который выглядит так, как если бы вы обращались к полям и свойствам напрямую, и одновременно с этим поддерживает инкапсуляцию.
Поэтому хотя getHitPoints и имеет префикс get, в Kotlin его можно отбросить и обращаться напрямую к hitPoints. Эта особенность стирает барьер между
Kotlin и Java.
Это относится и к методам записи. На данный момент герой и монстр уже хорошо знакомы и хотят развить отношения. Герой хотел бы расширить словарный запас монстра. Переместите
приветствие монстра в поле и добавьте для него методы чтения и записи, чтобы герой мог изменить приветствие и обучить монстра речи.
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class Jhava {
private int hitPoints = 52489112;
private String greeting = "BLARGH";
@NotNull
public String utterGreeting() {
return greeting;
}
. . . . .
public int getHitPoints() {
return hitPoints;
}
public String getGreeting() {
return greeting;
}
public void setGreeting(String greeting) {
this.greeting = greeting;
}
}
Рис.2. Замена greeting в Java (Jhava.java)
В Hero.kt исправьте adversary.greeting.
fun main(args: Array<String>) {
val adversary = Jhava()
val friendshipLevel = adversary.determineFriendshipLevel()
println(friendshipLevel?.toLowerCase() ?: "It's complicated.")
val adversaryHitPoints: Int = adversary.hitPoints
println(adversaryHitPoints.dec())
println(adversaryHitPoints.javaClass)
adversary.greeting = "Hello, Hero."
println(adversary.utterGreeting())
}
Файл с проектом можно взять
здесь.
Рис.3. Настройка поля Java из Kotlin (Hero.kt)
Чтобы изменить поле в Java, вместо вызова его метода записи можно использовать инструкцию присваивания. У вас есть преимущества синтаксиса Kotlin даже при работе с
Java API. Запустите Hero.kt и посмотрите, научил ли герой монстра новым словам.
Рис.4. Результат работы приложения
На следующем шаге мы рассмотрим, что происходит за пределами класса.
Предыдущий шаг
Содержание
Следующий шаг