繁体   English   中英

在“案例类”中具有“私有”构造函数字段有意义吗?

[英]Does it make sense to have a `private` constructor field in a `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: List[String] = members.map(_.name)
}

您可以看到Team是一个case class ,但是它有一个private领域的members 并且在主体中,它有几种方法来构造一个新的Team ,以及一个allNames方法来导出一些私有members

我不确定case class的用法是否合适,因为我认为case class是数据类,所以我们不应该使用private字段。 对于这种情况,我认为普通班就足够了:

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 ,也删除了private因为对于普通的类,构造函数的字段默认为private。

但是我不确定是否有充分的理由在第一种方法中编写代码。

案例类中的私有val有点令人惊讶,因为如果您认为获得价值的其他方法只是语法糖,它们就不会像您想象的那样私有。

特别是,模式匹配将为您提供基础价值:

whatever match {
  case Team(members) => println("I can see "+members.mkString)
}

而且值仍然在平等中起作用(即使您无法通过名称获取它),并且可以使用copy创建具有不同值的copy

有时,使用private val强制执行该类的最佳实践,即仅使用模式匹配来获取值(例如,因为您经常想对其他事物进行模式匹配,因此会增强一致性)。 有时,这表明程序员不了解其工作方式,并认为其强制完全缺乏对val的访问权。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM