Подтвердить что ты не робот

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

В 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.

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

4b9b3361

Ответ 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("+")

}

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

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