Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala case对象可以作为状态吗_Scala_Design Patterns_State - Fatal编程技术网

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

我当前的项目使用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 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获得一些灵感。