Геттеры и сеттеры в Котлине

Я новичок в Котлине, и я пытаюсь понять, как использовать геттеры и сеттеры.

Например, в Java я могу писать геттеры самостоятельно (сгенерировать по IDE) или использовать аннотации, такие как @Getter в ломбоке, – что было довольно просто.

Однако у Котлина есть поводки и сеттеры по умолчанию. Https://kotlinlang.org/docs/reference/properties.html Но я не могу понять, как его использовать.

Я хочу сделать это, скажем – похоже на java:

private val isEmpty: String get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility. 

Итак, как работают геттеры?

Solutions Collecting From Web of "Геттеры и сеттеры в Котлине"

Геттеры и сеттеры автоматически генерируются в Котлине. Если вы пишете:

 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 

Из-за частного модификатора рядом с установленным аксессуаром вы можете установить это значение только в методах внутри вашего объекта.

Правилами модификаторов видимости атрибутов свойств являются:

  • Видимость свойства var и val Getter должна быть точно такой же, как и для видимости свойства, поэтому вы можете явно дублировать модификатор свойства, но он избыточен:

     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) { } 

Getter в 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}") } 

Вы можете увидеть этот учебник для получения дополнительной информации:

Еще один учебник Kotlin для разработчиков Android

свойства

В мире Котлин классы не могут иметь полей, просто свойств. Var keyword говорит нам, что свойство изменено, в отличие от val. Давайте посмотрим пример:

 class Contact(var number: String) { var firstName: String? = null var lastName: String? = null private val hasPrefix : Boolean get() = number.startsWith("+") } 

Кодов мало, но многое происходит за кулисами. Мы пройдем его шаг за шагом. Прежде всего, мы создали публичный конечный класс Contact.

Это основное правило, с которым нам приходится сталкиваться: если не указано иное, классы являются общедоступными и окончательными по умолчанию (кстати, то же самое и для методов класса). Если вы хотите наследовать от класса, отметьте его ключевым словом open.