简单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类的特点是:
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
伴生对象 这只是一个例子。。你不应该读太多。