首页 > 解决方案 > 如何根据参数有条件地构造案例类?

问题描述

我目前正在尝试创建基于参数输入以不同方式构造的案例类。作为一个真实世界的用例,假设我们正在构建一个包含敏感信息的案例类。因此,每当案例类包含来自用户的数据时,我们都需要对他们的电话号码进行哈希处理,否则照常构造案例类。如果这没有多大意义,我创建了一个更轻松的示例来说明我正在尝试做的事情。

假设我们正在创建一个不接受悲伤牛的案例类,例如:

case class HappyCow(name: String, feeling: String)

我尝试通过定义一个 apply 方法来使案例类构造有条件:

case class HappyCow(name: String, feeling: String) {
  def apply(name: String, feeling: String): HappyCow =
    if (feeling == "sad") HappyCow(name, "Happy")
    else HappyCow(name, feeling)
}

但是测试我的解决方案是否有效会导致:

 val cow1 = HappyCow("Moowy", "excited")
 val cow2 = HappyCow("MooMoo", "sad")

 println(cow1) // HappyCow(Moowy,excited)
 println(cow2) // HappyCow(MooMoo,sad)
 println(cow2.feeling) // sad

我希望cow2.feeling是“快乐的”

标签: scala

解决方案


apply应该是伴生对象的方法,而不是案例类。

applyreplace HappyCow(name, "Happy")... with new HappyCow(name, "Happy")...的定义中,否则它是无限递归。

case class HappyCow(name: String, feeling: String)

object HappyCow {
  def apply(name: String, feeling: String): HappyCow =
    if (feeling == "sad") new HappyCow(name, "Happy")
    else new HappyCow(name, feeling)
}

val cow1 = HappyCow("Moowy", "excited")
val cow2 = HappyCow("MooMoo", "sad")

println(cow1) // HappyCow(Moowy,excited)
println(cow2) // HappyCow(MooMoo,Happy)
println(cow2.feeling) // Happy

推荐阅读