Intereting Posts
Kotlin – возможно, неправильно сообщая о неиспользуемом коде Получить строку базы данных с помощью Anko Android SpeechRecognizer не запускается снова В чем разница между () -> единицей и (единицей) -> типами единиц? Android предотвращает просмотр от успешных событий Firebase Admin SDK не может подключаться к базе данных из внутреннего файла jar Представление привязки Kotlin: как отличить переменную вида от локальной переменной? как добавить gradle (идеально используя kotlin-dsl) в существующий проект intellij python Невозможно заменить SAM-конструктор лямбдой, когда первый аргумент – это класс с одним методом Неразрешенная ссылка: SpringExtension с использованием @ExtendWith аннотации Как создать экземпляр абстрактного класса в Котлине? Не следует ли нам назвать функцию, аналогичную существующему классу в Котлине? Зачем? Как создать экземпляр универсального класса, передающего ссылку метода в конструкторе с kotlin Как обмениваться изображениями на Android с помощью Kotlin? Почему параметр Integer метода Java сопоставляется с Int, а не с типом платформы?

Kotlin – Понимание Getters и Setters

Kotlin автоматически генерирует его получатели и настройки, но я никогда не обращаюсь к ним? Кроме того, каков правильный способ создания пользовательского getter / setter в Kotlin? Когда я говорю myObj.myVar = 99 я чувствую, что myVar – это публичное поле myObj которому я обращаюсь напрямую? Что на самом деле происходит здесь?

На это ответили в нескольких местах, но я подумал, что я расскажу конкретный пример для людей, переезжающих в Котлин из Java / C # / C / C ++, и у кого был тот же вопрос, что и я:

Мне было трудно понять, как геттеры и сеттеры работали в Котлине, тем более, что они никогда не назывались явным образом (как на Java). Из-за этого мне было неприятно, так как казалось, что мы просто обращаемся к vars / vals как к полям. Поэтому я изложил небольшой эксперимент, чтобы продемонстрировать, что это не так, и что на самом деле это неявный (автогенератор) или явный getter / setter, который вызывается в Kotlin при доступе к переменной / значению. Разница в том, что вы явно не запрашиваете приемник / сеттер по умолчанию.

Из документации – полный синтаксис для объявления свойства:

 var <propertyName>: <PropertyType> [= <property_initializer>] [<getter>] [<setter>] 

И мой пример

 class modifiersEg { /** this will not compile unless: * - we assign a default here * - init it in the (or all, if multiple) constructor * - insert the lateinit keyword */ var someNum: Int? var someStr0: String = "hello" var someStr1: String = "hello" get() = field // field is actually this.someStr1, and 'this' is your class/obj instance set(value) { field = value } // kotlin actually creates the same setters and getters for someStr0 // as we explicitly created for someStr1 var someStr2: String? = "inital val" set(value) { field = "ignore you" } var someStr3: String = "inital val" get() = "you'll never know what this var actually contains" init { someNum = 0 println(someStr2) // should print "inital val" someStr2 = "blah blah blah" println(someStr2) // should print "ignore you" println(someStr3) // should print "you'll never know what this var actually contains" } 

Надеюсь, это поможет собрать все вместе для некоторых других?