【问题标题】:Class extends Case Class for Collections类扩展了集合的案例类
【发布时间】:2017-03-06 14:52:41
【问题描述】:

我可以创建一个仅对集合有用的案例类(阅读HashSet)和一个扩展此案例类以存储有用信息的类吗?

我的意思是这样的:

case class User(id: String)

class UserInfo(id: String) extends User(id) {

  var time = 0
  var sum = 0

}

我只想使用 UserInfo 将有关用户的信息存储在 HashSet 中,但使用案例类实现以及已经为收集实现的所有有用方法(又名 equals 和 hashCode)

以下 Yuval Itzchakov 评论:

abstract class User(val id: String) {

  private var time = 0L
  private var sum = 0L

  def addTime(_time: Long) = time += _time
  def addSum(_sum : Long) = sum  += _sum 

  def getTime() = time 
  def getSum() = sum  

}

case class UserInfo(override val id : String) extends User(id)

private vars 因为我想保证我可以只添加信息(getter 也一样)

【问题讨论】:

  • 如何将User 设为abstract class 和UserInfo 案例类?
  • 然后我可以在抽象类中添加所有有用的方法吗?
  • 是的,你可以。
  • 你能检查我的编辑并验证它吗?
  • 我建议使Users 属性不可变,并在每次添加时间或总和时返回一个副本。这样你就根本不需要 getter 和 setter。

标签: scala inheritance case-class


【解决方案1】:

可变性是一个坏主意,几乎总是应该避免。在保持不变性的同时做你需要的一种方法是使用伴随对象:

case class User(id: String, time: Long)

object User {
   def addTime(user: User, time: Long): User = user.copy(time = user.time + time)
}

val users = Set(User("John", 5), User("Mary", 10))
val sumTime = users.foldLeft(0L)((sum, user) => sum + user.time)
val usersWithTimeAdded = users.map(User.addTime(_, 2))

【讨论】:

  • 我能问你一件事吗?如果我有一个用户“John”怎么办。现在,如果我添加到 Set(User("John",2),User("John",4)),我的 Set 将有 2 个 John 用户,对吗?我不想要这个。我需要一个用户 John,每次我找到有关它的新信息时,我都需要添加到 John Instance
  • 有很多方法可以解决这个问题。一种是使用Map[String, User]。获取“John”的User 值;增加时间;并使用map + ("John" -> newTime) 之类的更新值生成一个新的地图副本。或者,如果你想变得花哨,你可以为此目的创建一个特殊的函数——或者甚至通过一个隐式类赋予Map该函数——如here所述。
  • 是的,但我想过,但我要求 unh 一组(我的意思是,我想避免使用地图,因为 User 对象已经自己处理信息)
  • 如果您坚持Set[User],您可以set.find(_.id == "John") 找到John,添加时间,并使用更新的User 创建新副本。
  • 也许我想错了。我发布这个问题也是因为我知道案例类非常适合收集。但是我想在类中存储一些不同的信息,正如您在我的代码中看到的那样,我的主要目标是仅使用用户(id)的一种信息来识别它(这是因为我正在使用一个只有一个 id 字符串的案例类)但是一旦得到用户我想更新它的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 2014-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多