我想为我的应用程序构建角色功能。所以,我认为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
。我以为我可以使用参数初始化Admin
和Pro
对象,但显然这不起作用。
如何做到这一点?
答案 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.
每当您重新启动应用程序时,其内存都将被清除。所以它无法知道你以前的身份证。