2014-03-28 23 views
1

我目前的项目正在使用Java。我们推动业务逻辑enum代表特定的状态(新建,注册等)。在scala中,我只是想知道用case对象作为状态是个好主意吗?有什么缺点。can case object as a state

一个简单的例子

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() 
    } 
} 
+0

将您的案例类设为大写字母,例如'Child'而不是'child'是个好习惯。 –

+0

查看Akka的[有限状态机](http://doc.akka.io/docs/akka/2.3.1/scala/fsm.html)(FSM)获取灵感。 –

回答

5

它可以而且事实上这是很常见的模式(顺便说伴随着密封的性状),实现我见过通常移动任何行动出状况并使用case objects作为标记,表示当前状态,沿着与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" 
} 

后面使用的情况下的类来存储数据推理(相对于将其存储在普通的旧类字段中)是不同的状态可能具有不同的变量组,并且具有案例类别,它更容易理解当前工作集合。

相关问题