Выявление отношений в Kotlin

Являются ли вложенные классы хорошим способом моделирования идентифицирующих отношений в Kotlin?

Требования:

  • проблема не может быть без серно
  • отзыв не может быть без проблемы
  • утверждение не может быть без отзыва

Выглядит довольно многословно:

      class Have {
    inner class Serno(val value: String) {
        override fun toString(): String = "serno: $value"
        fun nothing () = this@Have
        inner class Issue(val value: String) {
            override fun toString(): String = "issue: $value (${serno()})"
            fun serno () = this@Serno
            inner class Revocation(val value: String) {
                override fun toString(): String = "revocation: $value (${issue()})"
                fun issue () = this@Issue
                inner class Affirmation(val value: String) {
                    override fun toString(): String = "affirmation: $value (${revocation()})"
                    fun revocation () = this@Revocation
                }
            }
        }
    }
}

val serno: Have.Serno = Have().Serno("123")
val issue: Have.Serno.Issue = serno.Issue("SUP-1")
val revocation: Have.Serno.Issue.Revocation = issue.Revocation("2020")
val affirmation: Have.Serno.Issue.Revocation.Affirmation = revocation.Affirmation("2022")

println(serno)
println(issue)
println(revocation)
println(affirmation)

println(serno == affirmation.revocation().issue().serno())

Есть ли более простой способ добиться того же?

1 ответ

Обычно это достигается с помощью простых ненулевых свойств:

      class Serno(val value: String) {
    override fun toString(): String = "serno: $value"
}

class Issue(val value: String, val serno: Serno) {
    override fun toString(): String = "issue: $value ($serno)"
}

class Revocation(val value: String, val issue: Issue) {
    override fun toString(): String = "revocation: $value ($issue)"
}

class Affirmation(val value: String, val revocation: Revocation) {
    override fun toString(): String = "affirmation: $value ($revocation)"
}

val serno = Serno("123")
val issue = Issue("SUP-1", serno)
val revocation = Revocation("2020", issue)
val affirmation = Affirmation("2022", revocation)

И если вы не строги к формату, вы можете даже использовать встроенныйtoStringклассов данных и еще больше упростить:

      data class Serno(val value: String)

data class Issue(val value: String, val serno: Serno)

data class Revocation(val value: String, val issue: Issue)

data class Affirmation(val value: String, val revocation: Revocation)
Другие вопросы по тегам