Scala中实现Trait的Case Class如何使用字段默认值?
解决方案
问题翻译
现有如下Trait定义:
trait MyTrait { val country: String, val state: String, val commune: String = "nothing" }
需要用case class实现该Trait,代码框架如下:
case class ImplementTrait( country:String, state: String, // 疑问:如何在初始化时不传入commune的情况下,使用MyTrait中commune的默认值 ) extends MyTrait
需求:
- 调用
ImplementTrait(country, state)时,自动使用MyTrait中commune的默认值"nothing" - 调用
ImplementTrait(country, state, commune)时,使用传入的commune值
实现方式
可以通过给case class的commune参数设置默认值,并显式覆盖Trait中的同名val来实现,推荐两种写法:
写法一:直接复用默认值字符串
trait MyTrait { val country: String val state: String val commune: String = "nothing" } case class ImplementTrait( country: String, state: String, override val commune: String = "nothing" ) extends MyTrait
写法二:提取常量统一维护(更易扩展)
如果后续可能修改默认值,建议把Trait中的默认值提取为常量,避免多处重复维护:
trait MyTrait { val country: String val state: String val commune: String = MyTrait.DEFAULT_COMMUNE // 定义伴生对象存储默认值常量 object MyTrait { val DEFAULT_COMMUNE = "nothing" } } case class ImplementTrait( country: String, state: String, override val commune: String = MyTrait.DEFAULT_COMMUNE ) extends MyTrait
验证调用
- 无commune参数调用:
val inst1 = ImplementTrait("中国", "北京"),此时inst1.commune的值为"nothing" - 传入commune参数调用:
val inst2 = ImplementTrait("美国", "加州", "洛杉矶"),此时inst2.commune的值为"洛杉矶"
内容的提问来源于stack exchange,提问作者Maria
相关产品推荐
相关产品推荐

