Можно ли изменить поведение методов toString (), сгенерированных для классов данных Kotlin? - PullRequest
0 голосов
/ 06 февраля 2019

Например:

data class Key(
    val id:          Int,
    val secret:      String,
    val description: String?
)

Чтобы исключить или замаскировать специальные свойства, такие как пароли или номера кредитных карт:

Key(
    id          = 1,
    secret      = "foo",
    description = "bar"
).toString()
// Key(id=1, description=bar)
// or
// Key(id=1, secret=********, description=bar)

Или игнорировать свойства с помощью null s, чтобы получить полученную строкуболее читабельно:

Key(
    id          = ...,
    secret      = ...,
    description = null
).toString()
// Key(id=...)
// or
// Key(id=..., secret=...)

Реализация toString() каждый раз может быть очень утомительной и подверженной ошибкам, особенно если у вас слишком много свойств в классе.

Есть ли какие-либо (предстоящие)решение этой проблемы (например, как Lombok для Java)?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я переработал предыдущий ответ Андрея Вдовиченко следующим образом:

data class Key(val id: Int, val secret: String, val description: String?){
    override fun toString() = kotlinToString(target = this, properties = arrayOf(prop(Key::id), prop(Key::description), prop(Key::secret)))
}

fun <T>prop(kp : KProperty1<T, Any?>) : KProperty1<Any, Any?> {
    return kp as KProperty1<Any, Any?>
}

fun kotlinToString(target: Any, properties : Array<KProperty1<Any, Any?>>) : String {
    return properties
            .map { kp -> Pair(kp.name, kp.get(target)) }
            .filter { p -> p.second != null }
            .map { p -> "${p.first}: ${p.second}" }
            .joinToString(", ")
}

Вы можете протестировать реализацию mi, используя следующую функцию main:

fun main(args : Array<String>) {
    println(Key(1, "aa", "bbb").toString())
    println(Key(1, "aa", null).toString())
}

, выход которой равен

id: 1, description: bbb, secret: aa
id: 1, secret: aa

Может быть, вы можете изменить реализацию kotlinToString, чтобы включить в выходную строку префикс для класса , возможно, передав его в качестве параметра kotlinToString, но я надеюсь, что это можетпривет тебе!

0 голосов
/ 06 февраля 2019

Вы можете попробовать что-то вроде этого:

data class Key(val id: Int, val secret: String, val description: String?){ 
    override fun toString() = kotlinToString(properties = arrayOf(Key::id, Key::description)
} 

Пример вывода:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...