Scala 在“case class”中使用“private”构造函数字段有意义吗?
我看到一些Scala代码如下:Scala 在“case class”中使用“private”构造函数字段有意义吗?,scala,private,case-class,Scala,Private,Case Class,我看到一些Scala代码如下: case class Team(private val members: List[User]) { def removed(member: User): Team = { Team(members.filterNot(_ == member)) } def added(member: User): Team = { Team(member :: members) } def allNames
case class Team(private val members: List[User]) {
def removed(member: User): Team = {
Team(members.filterNot(_ == member))
}
def added(member: User): Team = {
Team(member :: members)
}
def allNames: List[String] = members.map(_.name)
}
您可以看到团队
是一个案例类
,但它有一个私有
字段成员
。在正文中,它有几种方法来构建一个新的团队
,以及一种方法allNames
,该方法导出私有成员的一些信息
我不确定案例类
的使用是否良好,因为我认为案例类
是一个数据类,我们不应该使用私有
字段。对于这种情况,我认为一个普通的类就足够了:
class Team(members: List[User]) {
def removed(member: User): Team = {
new Team(members.filterNot(_ == member))
}
def added(member: User): Team = {
new Team(member :: members)
}
def allNames: List[String] = members.map(_.name)
}
您可以看到我删除了案例
,也删除了私有
,因为对于普通类,构造函数的字段默认是私有的
但是我不确定是否有任何好的理由在第一种方法中编写代码。case类中的私有VAL有点令人惊讶,因为它们不像您想象的那样私有,如果您认为获得该值的其他方法只是语法糖的话 特别是,模式匹配将为您提供基本值:
whatever match {
case Team(members) => println("I can see "+members.mkString)
}
而且该值仍然在相等性中起作用(即使您无法通过名称获得它),您可以使用copy
创建具有不同值的副本
有时,
private val
用于强制该类的最佳实践,即仅使用模式匹配来获取值(例如,因为您通常希望模式匹配其他内容,这强制了一致性)。有时,这表明程序员不了解它是如何工作的,并且认为它完全没有访问val的权限。如果类是有点令人惊讶的,因为它们不像你想象的那样私有,如果你认为获得该值的其他方法只是语法糖的话
特别是,模式匹配将为您提供基本值:
whatever match {
case Team(members) => println("I can see "+members.mkString)
}
而且该值仍然在相等性中起作用(即使您无法通过名称获得它),您可以使用copy
创建具有不同值的副本
有时,
private val
用于强制该类的最佳实践,即仅使用模式匹配来获取值(例如,因为您通常希望模式匹配其他内容,这强制了一致性)。有时这表明程序员不了解它是如何工作的,并且认为它完全无法访问val。该类型将用于模式匹配还是用于封闭集?@user2864740没有发现这些用法该类型将用于模式匹配还是用于封闭集?@user2864740没有发现这些用法