🗒 Задача¶
Класс описывает пользователя и хранит свойства логин и пароль (без инициализации по умолчанию).
-
при попытке изменить пароль, в консоль должно выводиться «Вы не можете изменить пароль».
-
при попытке прочитать пароль – вместо символов должны отображаться звездочки (по количеству символов пароля).
-
при изменении логина в консоли должно печататься сообщение об успешной смене логина.
Создай пользователя с произвольными данными и протестируй изменение логина и пароля. Вся реализация должна быть на сеттерах и геттерах.
❌ Ошибки¶
-
хардкодят в классе значения типа
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)
}