【问题标题】:Identifying relationships in Kotlin识别 Kotlin 中的关系
【发布时间】:2022-12-06 07:39:05
【问题描述】:

嵌套类是在 Kotlin 中建模识别关系的好方法吗?

要求:

  • 一个问题不能没有 serno
  • 撤销不可能没有问题
  • 肯定不能没有撤销

看起来很冗长:

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())

有没有更简单的方法来实现同样的目标?

【问题讨论】:

    标签: kotlin identifying-relationship


    【解决方案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 格式不严格,你甚至可以使用内置的 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 2010-10-20
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多