2014-03-28 96 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" 
} 

後面使用的情況下的類來存儲數據推理(相對於將其存儲在普通的舊類字段中)是不同的狀態可能具有不同的變量組,並且具有案例類別,它更容易理解當前工作集合。

相關問題