Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在“case class”中使用“private”构造函数字段有意义吗?_Scala_Private_Case Class - Fatal编程技术网

Scala 在“case class”中使用“private”构造函数字段有意义吗?

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

我看到一些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: 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没有发现这些用法