case对象简单用例与示例

时间:2015-07-31 21:21:44

标签: scala object case-class

我是斯卡拉的新手。 到目前为止,我了解到,scala中的对象是单例,如果我们声明case对象,那么还会添加override和hashcode默认实现。

只是想知道找到任何简单的实际例子,我们可以在其中拟合案例对象。

修改1:

@Aivean: -

但是如果没有声明对象的情况,下面的代码也可以正常工作: -

object ScalaPractice {

  def main(args: Array[String]): Unit = {
    val trade1 = Trade(EUR)
    trade1.currency match{
      case EUR | USD => println("trade possiblein this currency : " + trade1.currency)
      case _ => println("trade not possible")
    }
  }
}

case class Trade(val currency : Currency){

}

sealed trait Currency { def name: String }
object EUR extends Currency { val name = "EUR" }
object USD extends Currency { val name = "USD" }

为什么需要添加案例

编辑2:

@dwickern

@dwickern 引用: -

将对象转换为案例对象可以得到:

  1. 稍微更好的默认toString实现
  2. case对象自动实现Serializable。这很重要,例如当通过akka remoting将这些对象作为消息传递时
  3. 您还可以获得默认的equals,hashCode和scala.Product实现,就像案例类一样,但这些并不重要
  4. scala网站上是否有任何官方文档,scal docs等。(特别是第三点,粗体斜体)

3 个答案:

答案 0 :(得分:2)

object转换为case object会给您:

  1. 稍微更好的默认toString实施
  2. case object自动实施Serializable。这很重要,例如当通过akka remoting将这些对象作为消息传递时
  3. 例如:

    case object USD
    object EUR
    
    println(USD) // USD
    println(EUR) // testapp$EUR$@edf4efb
    
    val oos = new ObjectOutputStream(new ByteArrayOutputStream())
    oos.writeObject(USD)
    oos.writeObject(EUR) // java.io.NotSerializableException
    

    您也可以像equals一样获得默认hashCodescala.Productcase class实施,但这些实际上并不重要

答案 1 :(得分:0)

一个很好的例子是 actor 模型。这里case对象可以表示要发送给actor的消息:

case object Start

someActorRef ! Start

此对象不包含任何仅用于消息传递协议的数据 - 表示actor应该执行一些启动逻辑。

另一个例子是,如果您编写用于远程控制的API,您的API可以采用以下命令:左转,右转等。将这些命令实现为案例对象可能是个好主意 - 它们没有任何州:

case object Left
case object Right
case object Up
case object Down

答案 2 :(得分:0)

  1. 案例对象在用作枚举(example from here)时非常方便:
  2. sealed trait Currency { def name: String }
    case object EUR extends Currency { val name = "EUR" }
    case object USD extends Currency { val name = "USD" }
    
    1. Case对象可以与case类一起使用,以便为某些极端情况提供不可变的实现。
    2. 检查Nil的{​​{1}}:

      scala.collection.immutable