如何在Scala中使用带有参数的singelton(对象)?

时间:2016-05-20 19:17:28

标签: scala

我想为我的应用程序构建角色功能。所以,我认为object会派上用场,因为我需要一个具有不同角色的Singelton。

因此,我有以下代码:

trait Role {
  def id: UUID

  def name: String
}

object Admin extends Role {
  val id = UUID.randomUUID()
  val name = "admin"
}


object Pro extends Role {
  val id = UUID.randomUUID()
  val name = "pro"
}

但是,在我将这些角色保留在我的数据库中并重新启动应用程序之后,我注意到角色的id已更改,这意味着它与我在启动时保持这些角色的角色不同申请首先。因此,如果具有相同名称的角色已存储在数据库中并将其设置为Singelton对象,则需要设置id。我以为我可以使用参数初始化AdminPro对象,但显然这不起作用。

如何做到这一点?

2 个答案:

答案 0 :(得分:1)

首先,很难通过仅查看此代码来讨论该问题,而不知道如何尝试执行数据库持久性部分。

按照你的代码,通过调用randomUUID来初始化id,所以每次启动你都会得到一个新的。系统按设计工作。

其次,我不确定我们是否同意单身人士是什么以及两个'对象'的语义是什么。

对我来说,看起来你确实想要两个不同类型Role的实例,而不是一个单例类型Admin和一个不同的单例类型Pro,因为这两个实例只在属性值上有所不同,而在结构上不同。

单例对象已经是一个对象,实际上是它的唯一对象。因此,在某种构造过程中从外部设置其值的概念,就像在实例化期间对类进行的那样,在这里并不适用。

答案 1 :(得分:0)

看看下面的代码:

object Admin extends Role {
  val id = getPersistedIDFromDatabase(name).getOrElse { 
    pesistID(name, UUID.randomUUID())
  }
  val name = "admin"
}

// getThePersistedIDFromDatabase => executes the `select` SQL query and returns an Optional ID, i.e., Some(id) if the admin already exists; Otherwise None.

每当您重新启动应用程序时,其内存都将被清除。所以它无法知道你以前的身份证。