简单rest scala中Book.scala文件内容背后的原因是什么

简单rest scala中Book.scala文件内容背后的原因是什么,scala,api,rest,playframework-2.0,Scala,Api,Rest,Playframework 2.0,在Book.scala文件中,如下所示 package models import play.api.libs.json.Json object Book { case class Book(name: String, author: String) implicit val bookWrites = Json.writes[Book] implicit val bookReads = Json.reads[Book] var books = List(Book("TA

Book.scala
文件中,如下所示

package models

import play.api.libs.json.Json

object Book {

  case class Book(name: String, author: String)

  implicit val bookWrites = Json.writes[Book]
  implicit val bookReads = Json.reads[Book]

  var books = List(Book("TAOCP", "Knuth"), Book("SICP", "Sussman, Abelson"))

  def addBook(b: Book) = books = books ::: List(b)
}

为什么里面有一个
Book
对象和一个
Book
案例类?为什么不只是一本
案例类(或者只是一本
类而不是案例类)?上面的结构有哪些优点/缺点?

本代码中Book对象的角色更像是一个静态Book utils/manager类,它包含一个书籍列表。您可以想象这是一个Library类,它允许添加书籍


Book case类只是书籍实例的匿名类。正如m-z所说,这只是一个例子,对于更复杂的类,您可以将其移动到一个独立的Book类。

我相信这只是一个小例子,有人把它放在一起,所以您不应该读太多。但是它展示了一些被认为是反模式的东西:嵌套在其他类中的case类。一些最佳实践指南,例如,建议避免在其他类中嵌套case类,这是有充分理由的:

这很诱人,但您几乎不应该定义嵌套的case类 在另一个对象/类中,因为它与Java的 序列化。原因是,当序列化案例类时 关闭“this”指针并序列化整个对象 如果你把你的应用程序对象的每一个实例的 案例类你序列化了整个世界

case类的特点是:

  • 我们期望case类是不可变的(一个值、一个事实),因此
  • 人们期望case类可以轻松序列化
  • 喜欢平面层次结构

    例如,这个小程序抛出了一个异常,这有点出乎意料:

    import java.io._
    
    class Outer {
      case class Inner(a: Int)
    }
    
    object Test extends App {
        val inner = (new Outer).Inner(1)
        val oos = new ObjectOutputStream(new FileOutputStream("/tmp/test"))
        oos.writeObject(inner)
        oos.close
    }
    
    如果此外部
    书籍
    对象的唯一目的是将公共功能组合在一起,则
    将是首选结构


    此外,即使出于某些其他原因需要
    对象
    ,将该对象命名为与内部case类相同的对象也是令人困惑的,特别是因为case类会自动生成伴随对象。因此在这个例子中有一个
    Book
    对象,一个
    Book.Book
    案例类,因此还有一个
    Book.Book
    伴生对象

    这只是一个例子。。你不应该读太多。