Scala case对象可以作为状态吗
我当前的项目使用Java。我们将业务逻辑推送到表示特定状态的enum,例如New、Registered等等。在scala中,我只是想知道使用case对象作为状态是否是一个好主意?缺点是什么 一个简单的例子Scala case对象可以作为状态吗,scala,design-patterns,state,Scala,Design Patterns,State,我当前的项目使用Java。我们将业务逻辑推送到表示特定状态的enum,例如New、Registered等等。在scala中,我只是想知道使用case对象作为状态是否是一个好主意?缺点是什么 一个简单的例子 trait State { def read() : Try[String] = { Failure(new IllegalStateException("too young to read")) } } case object child extends State case o
trait State {
def read() : Try[String] = {
Failure(new IllegalStateException("too young to read"))
}
}
case object child extends State
case object young extends State {
override def read() : Try[String] = {
Success("young people read book")
}
}
case object elder extends State {
override def read() : Try[String] = {
Success("elder people read book")
}
}
class Person(state : State) {
def read() : Try[String] = {
state.read()
}
}
它可以是,事实上这是一种非常常见的模式,顺便说一句,但我看到的实现通常会将任何操作移出状态,并将用例对象作为表示当前状态的标记,以及可能存储一些状态数据的用例类:
sealed trait State
case class Connected(messagesProcessed: Long) extends State
case object Connecting extends State
case object Disconnected extends State
def foo() = state match {
case Connected(count) => "do something"; state = Connected(count + 1) // could be .copy(..)
case Connecting => "wait patiently"
case Disconnected => "trigger reconnection"
}
使用case类存储数据而不是将数据存储在普通的旧类字段中的原因是,不同的状态可能有不同的变量集,使用case类更容易理解当前的工作集。可以,事实上,这是一种非常常见的模式,顺便说一句,具有密封特性,但我看到的实现通常会将任何操作移出状态,并将用例对象用作表示当前状态的标记,以及可能存储一些状态数据的用例类:
sealed trait State
case class Connected(messagesProcessed: Long) extends State
case object Connecting extends State
case object Disconnected extends State
def foo() = state match {
case Connected(count) => "do something"; state = Connected(count + 1) // could be .copy(..)
case Connecting => "wait patiently"
case Disconnected => "trigger reconnection"
}
使用case类存储数据与将数据存储在普通的旧类字段中的原因是,不同的状态可能有不同的变量集,使用case类更容易理解当前的工作集。最好将case类设置为大写,例如Child而不是Child。查看Akka的FSM获得一些灵感。将您的案例类设置为大写是一种很好的做法,例如Child而不是Child。查看Akka的FSM获得一些灵感。