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

🗒 Задача

Класс описывает пользователя и хранит свойства логин и пароль (без инициализации по умолчанию).

  • при попытке изменить пароль, в консоль должно выводиться «Вы не можете изменить пароль».

  • при попытке прочитать пароль – вместо символов должны отображаться звездочки (по количеству символов пароля).

  • при изменении логина в консоли должно печататься сообщение об успешной смене логина.

Создай пользователя с произвольными данными и протестируй изменение логина и пароля. Вся реализация должна быть на сеттерах и геттерах.

❌ Ошибки

  • хардкодят в классе значения типа var login: String = "admin”

  • присваивают новый пароль, потом пишут, что пароль изменить нельзя

  • геттер не возвращает нужное количество звездочек

✏️ Комментарии

В текущей реализации объекты данного класса будут всегда создаваться с одними и теми же логинами и паролями, что противоречит корректности логики. Поэтому предлагаю воспользоваться основным конструктором, который при создании объекта будет принимать нужные параметры и присваивать их свойству уже в теле класса.

`class User(_login: String, _password: String)`

Обращаю внимание, что в конструкторе мы не пишем ключевые val/var. То есть под эти свойства класса память выделяется только один раз. И делается это в теле класса, потому что по ТЗ нам необходимо применить для них setter и getter. Присваивание будет выглядеть так `var login: String = _login`. Теперь при создании объекта переданный логин запишется в свойство класса.
Так логин не перезапишется. Нужно именно присвоить переданное `value` переменной `field` (которая фактически и запишет значение в свойство)
В данном случае происходит печать в консоль, но сама строка не возвращается. Предлагаю генерировать именно строку с определенным количеством звездочек. И еще можно обратить внимание на экстеншн `repeat()`
Текущий код сначала присваивает полю новый пароль (из `value` в `field`), затем оповещает пользователя, что пароль менять нельзя. Не сходится.
В данном случае геттер не возвращает количество звездочек по длине пароля. Я бы обратил внимание в сторону функции `repeat()`
Можно воспользоваться методом формирования строки из переданных данных, под капотом которого работает цикл. И применив его к строке возвращать нужное количество звездочек `"*".repeat(field.length)`
`getter` срабатывает при попытке обратиться к нему. Нам надо просто возвращать строку, а не менять свойство объекта с реальными данными на "звездочки"

🧾 Решение

class User(_login: String, _password: String) {

    var password: String = _password
        set(value) {
            println("Вы не можете изменить пароль")
        }
        get() = "*".repeat(field.length)

    var login: String = _login
        set(value) {
            field = value
            println("Логин успешно изменен на $value")
        }
}

fun main() {
    val user = User("oldLogin", "password123")

    user.login = "newLogin"
    user.password = "newPassword" 

    println(user.password) 
}