scala - 如何根据参数有条件地构造案例类?
问题描述
我目前正在尝试创建基于参数输入以不同方式构造的案例类。作为一个真实世界的用例,假设我们正在构建一个包含敏感信息的案例类。因此,每当案例类包含来自用户的数据时,我们都需要对他们的电话号码进行哈希处理,否则照常构造案例类。如果这没有多大意义,我创建了一个更轻松的示例来说明我正在尝试做的事情。
假设我们正在创建一个不接受悲伤牛的案例类,例如:
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
是“快乐的”
解决方案
apply
应该是伴生对象的方法,而不是案例类。
在apply
replace 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
推荐阅读
- swift - 如何实现复利公式
- c# - 发布自包含 EXE 的问题(Nuget 问题)
- r - 如何在 R 中从没有类或 id 的页面中抓取多个表
- javascript - 如何在 React 中的按钮上使用 SVG 作为背景图像
- javascript - 如何解决选项卡模态宽度问题?
- powershell - 如何使用 powershell 对进程名称进行分组并显示使用的内存总和
- google-apps-script - 我已启用 V8 运行时,但尝试保存时出现错误:“我们很抱歉,发生服务器错误。请稍候,然后重试。”
- javascript - 在Javascript数组中将空值更改为NaN
- bash - zsh 和 bash 在 echo 上有什么区别?
- spring-webflux - Flux.concatMap 在返回结果之前进入下一个事件