Геттеры и сеттеры в Котлине
В Java, например, я могу написать getters самостоятельно (сгенерированный IDE) или использовать аннотации, такие как @Getter в lombok - это было довольно просто.
Однако у Kotlin есть получатели и сеттеры по умолчанию.
Но я не могу понять, как их использовать.
Я хочу сделать это, скажем - похоже на Java:
private val isEmpty: String
get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility.
Итак, как работают геттеры?
Ответы
Ответ 1
Получатели и сеттеры автоматически генерируются в Котлине. Если вы пишете:
val isEmpty: Boolean
Он равен следующему Java-коду:
private final Boolean isEmpty;
public Boolean isEmpty() {
return isEmpty;
}
В вашем случае модификатор частного доступа является избыточным - isEmpty является закрытым по умолчанию и может быть доступен только получателю. Когда вы пытаетесь получить свой объект isEmpty, вы вызываете метод get в реальном. Для лучшего понимания геттеров/сеттеров в Котлине: два примера кода ниже равны:
var someProperty: String = "defaultValue"
и
var someProperty: String = "defaultValue"
get() = field
set(value) { field = value }
Также хочу отметить, что this
в getter не является вашим свойством - это экземпляр класса. Если вы хотите получить доступ к значению поля в getter или setter, вы можете использовать зарезервированное слово field
для него:
val isEmpty: Boolean
get() = field
Если вы хотите использовать метод get в открытом доступе, вы можете написать этот код:
var isEmpty: Boolean
private set
из-за частного модификатора рядом с установленным аксессуаром вы можете установить это значение только в методах внутри вашего объекта.
Ответ 2
Правила об аксессуарах свойств модификаторы видимости заключаются в следующем:
-
Доступность Getter свойств var
и val
должна быть точно той же для видимости свойства, поэтому вы можете явно дублировать модификатор свойства, но он избыточен
protected val x: Int
protected get() = 0 // No need in `protected` here.
-
Видимость сеттера для свойства var
должна быть той же или менее разрешающей, чем видимость свойства:
protected var x: Int
get() = 0
private set(x: Int) { } // Only `private` and `protected` are allowed.
В Kotlin свойства всегда доступны через getter и setter, поэтому нет необходимости создавать свойство private
с public
аксессуарами, например, в Java - его фоновое поле (если имеется) уже является приватным. Таким образом, модификаторы видимости для аксессуаров свойств используются только для того, чтобы сделать видимость сеттера менее разрешительной:
-
Для свойства с базовым полем и объектами доступа по умолчанию:
var x = 0 // `public` by default
private set
-
Для свойства без поля поддержки:
var x: Int // `public` by default
get() = 0
protected set(value: Int) { }
Ответ 3
Getter in kotlin по умолчанию является общедоступным, но вы можете установить setter в private и установить значение с помощью одного метода внутри класса. Как это.
/**
* Created by leo on 17/06/17.*/
package foo
class Person() {
var name: String = "defaultValue"
private set
fun foo(bar: String) {
name = bar // name can be set here
}
}
fun main(args: Array<String>) {
var p = Person()
println("Name of the person is ${p.name}")
p.foo("Jhon Doe")
println("Name of the person is ${p.name}")
}
Ответ 4
Вы можете увидеть это руководство для получения дополнительной информации:
Еще одно учебное пособие Kotlin для разработчиков Android
Свойства
В мире Котлина классы не могут иметь поля, просто свойства. вар ключевое слово говорит нам, что свойство изменено, в отличие от val. Давайте см. пример:
class Contact(var number: String) {
var firstName: String? = null
var lastName: String? = null
private val hasPrefix : Boolean
get() = number.startsWith("+")
}
Существует не так много кода, но многое происходит за сцены. Мы пройдем его шаг за шагом. Прежде всего, мы создали публичный контакт конечного класса.
Это основное правило, с которым мы сталкиваемся: если не указано иное, классы являются общедоступными и окончательными по умолчанию (кстати, то же самое для класса). Если вы хотите наследовать от класса, отметьте его открытым ключевое слово.