Я создаю объект myDayForecast со вторичной конструкцией, я думаю, что var bb будет пустым, потому что парматер вторичной конструкции, который переходит к основной конструкции, – HashMap (). Я вижу некоторый документ о HashMap (), он будет пустым.
Но после запуска кода я обнаружил, что var bb не пуст (вы можете видеть изображение), почему?
var myDayForecast= DayForecast(15L,"Desciption",10,5,"http://www.a.com",10L) var bb=myDayForecast.map class DayForecast(var map: MutableMap<String, Any?>) { var _id: Long by map var date: Long by map var description: String by map var high: Int by map var low: Int by map var iconUrl: String by map var cityId: Long by map constructor(date: Long, description: String, high: Int, low: Int, iconUrl: String, cityId: Long) : this(HashMap()) { this.date = date this.description = description this.high = high this.low = low this.iconUrl = iconUrl this.cityId = cityId } }
Изображение результатов
В конце, если строка определения вспомогательного конструктора:
constructor(date: Long, description: String, high: Int, low: Int, iconUrl: String, cityId: Long) : this(HashMap()) {
: this(HashMap())
– вызов основного конструктора:
DayForecast(var map: MutableMap<String, Any?>)
но с пустым HashMap в качестве аргумента.
Поэтому, когда вы делаете звонок:
var myDayForecast=DayForecast(15L,"Desciption",10,5,"http://www.a.com",10L)
одна из первых вещей, которая происходит, заключается в том, что первичный конструктор вызывается с пустой HashMap, как указано выше.
Это как если бы вы назвали основной конструктор следующим образом:
DayForcast (map = HashMap ())
Итак, теперь карта была установлена на пустой HashMap.
Во вторичном конструкторе каждое из полей помечено map
, где map
– свойство MutableMap DayForecast. как показано здесь:
class DayForecast(var map: MutableMap<String, Any?>) { var _id: Long by map var date: Long by map var description: String by map var high: Int by map var low: Int by map var iconUrl: String by map var cityId: Long by map ... }
Это означает, что любой доступ к этим полям делегируется объекту, на который ссылается map
, которая в этом случае является объектом MutableMap
. Для объекта MutableMap это означает, что компилятор переводит вызовы, такие как this.date = 15L
в нечто подобное this.map.put («date», 15L), а ссылки, такие как blah = this.date
будут переведены на что-то вроде: blah = this.map.get("date")
Затем, после вызова первичного конструктора, выполняется вторая часть вторичного конструктора.
this.date = date this.description = description this.high = high this.low = low this.iconUrl = iconUrl this.cityId = cityId
Теперь, поскольку каждое из этих свойств объявляется как var propXYZ by map
каждый из этих вызовов транслируется в вызовы типа this.map.put("date", date)
, который заполняет первоначально пустую HashMap значениями, так что время, которое вы вызываете
var bb=myDayForecast.map
, теперь карта заполнена HashMap.
Пожалуйста, ознакомьтесь с разделом свойств делегата документации Kotlin, если это все еще запутывает.
Вы используете карту для хранения ваших данных о собственности . Это делается с помощью by map
и работает для получения и настройки. Назначив значение свойствам, вы добавляете элементы на карту. Поэтому изначально ваш HashMap
пуст, но в конце конструктора вы добавили значения к нему неявно. Kotlin не создает другое поле или механизм для хранения значений в противном случае.