🗒 Задача¶
Каждый раз, когда посылка прибывает в промежуточный пункт обработки, в программе меняется её местоположение. Опиши класс посылки с такими вводными:
-
свойства класса хранят: поле с номером посылки и поле с текущим местоположением;
-
поле класса хранит счетчик перемещений, обновляющийся при перезаписи местоположения.
Сымитировать прибытие посылки в новый пункт обработки, протестировать изменение счетчика. При реализации использовать сеттер.
❌ Ошибки¶
- объявляют val и в основном конструкторе, и в теле класса
✏️ Комментарии¶
Вот здесь мы создали переменную (поле) и присвоили `location`, для которого уже также было выделено место в памяти (`val location`). Нужно упростить логику, не выделяя память переменным в основном конструкторе, а передавать значение при инициализации прямо сюда.
Именно поэтому должен пропасть варнинг `Existing backing field is not assigned by the setter`, потому, что при переопределении сеттера будет использоваться специальная переменная `field`
Верно, но обращаю внимание для id нигде не выделена память, поэтому при создании объекта это значение нигде не сохранится. Для этого поля нужно найти какое-то решение.
Здесь предлагаю реализовать инициализацию данных через основной конструктор. Иначе получается, что любая посылка (любой созданный объект) имеет данную локацию и все остальные поля. Но это не относится к счетчику, он по умолчанию и должен создаваться с 0.
Тут предлагаю более короткую форму применить. Использовать постфиксный инкремент и убрать скобки условного выражения, потому что его тело состоит из одной строки.
Получается ты проверяешь на равенство присваемого поля, но во всех случаях все равно перезаписываешь переменную с локацией.
В задаче все имеется в виду переопределение стандартного сеттера, а не реализация своей функции-сеттера.
Не рекомендую использовать имена классов из Android SDK. Например, в Android есть класс [Parcel](https://developer.android.com/reference/android/os/Parcel). Чтобы никого не вводить в заблуждение.
🧾 Решение¶
class PostalParcel(val parcelNumber: String, initialLocation: String) {
var movementCounter = 0
var location: String = initialLocation
set(value) {
field = value
movementCounter++
}
// функция НЕ обязательна
fun moveTo(newLocation: String) {
location = newLocation
}
}
fun main() {
val myParcel = PostalParcel("123456", "New York")
println("Initial location: ${myParcel.location}, Movements: ${myParcel.movementCounter}")
myParcel.moveTo("Chicago")
println("New location: ${myParcel.location}, Movements: ${myParcel.movementCounter}")
myParcel.moveTo("San Francisco")
println("New location: ${myParcel.location}, Movements: ${myParcel.movementCounter}")
}