class User private constructor(
val username: String,
val email: String,
val age: Int
) {
// companion object — «статика» по-котлиновски
companion object {
const val MIN_AGE = 0
const val MAX_AGE = 150
fun createGuest(): User = User("guest", "guest@example.com", 0)
fun fromMap(map: Map<String, String>): User? {
val username = map["username"] ?: return null
val email = map["email"] ?: return null
val age = map["age"]?.toIntOrNull() ?: return null
return if (age in MIN_AGE..MAX_AGE) User(username, email, age) else null
}
}
override fun toString(): String =
"User(username='$username', email='$email', age=$age)"
}
fun main() {
val guest = User.createGuest()
// корректная карта
val alex = User.fromMap(
mapOf(
"username" to "alex",
"email" to "alex@mail.ru",
"age" to "25"
)
)
// некорректная карта — без email, должно быть null
val invalid = User.fromMap(
mapOf(
"username" to "bob",
"age" to "30"
)
)
println(guest)
println(alex)
println(invalid) // null
}