Перейти к содержанию

🗒 Задача

Каждый раз, когда посылка прибывает в промежуточный пункт обработки, в программе меняется её местоположение. Опиши класс посылки с такими вводными:

  • свойства класса хранят: поле с номером посылки и поле с текущим местоположением;

  • поле класса хранит счетчик перемещений, обновляющийся при перезаписи местоположения.

Сымитировать прибытие посылки в новый пункт обработки, протестировать изменение счетчика. При реализации использовать сеттер.

❌ Ошибки

  • объявляют 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}")
}