何时使用对象以及何时在Scala中使用类

时间:2014-06-15 04:50:07

标签: scala playframework

我有一个名为MyService的服务对象,其中定义了我的Play应用程序控制器使用的函数。 MyService中的一个特定功能是解析一些文本,并将其转换为JSON对象。所以我的流程将是:

  • 将包含非结构化书籍信息(标题,作者等)的一些文本解析为一些Scala对象(书籍对象)
  • 将Book对象转换为JSON格式
  • 返回JSON

我想知道的是,在解析文本和创建Scala对象的步骤中,我应该如何定义它们?如果这是Java,我会有一个名为'Book'的内部类,但是使用Scala我不知道我是否应该在MyService对象中定义内部对象或内部类,我不知道为什么/什么时候我会选择一个而不是另一个。

有人可以解释何时使用对象以及何时使用类?

2 个答案:

答案 0 :(得分:0)

当您只需要一个类的实例时,可以使用objectobjects不能包含参数,可以通过MyObject.myMethod访问其方法和值。

在Java中,您将使用单例模式来实现Scala中的object。 然后你会有类似MyObject.getInstance().myMethod的东西。

在您的情况下,您想要将信息解析为一个类。我会将解析器类设为object(假设解析过程是静态的)。 但结果不是静态的,因为它依赖于解析的数据。书应该绝对是一个阶级。 (如果只有一本书,则解析没有多大意义,是吗?)

答案 1 :(得分:0)

@ Kigyo的答案很好,但还有其他一些问题需要解决。您正在MVC框架内工作,而Book您正在描述的声音与模型完全相同。您描述的此MyService对象开始听起来非常臃肿,并且将Book序列化为JSON是您可以在Play模型中完全执行的操作。

package models

import play.api.libs.json._

case class Book(title: String, author: String, pages: Int)

object Book {

    /** Use one of Play's json macros to define an implicit serializer/deserializer */
    implicit val jsonFormat: Format[Book] = Json.format[Book]

    def parse(rawText: String): Book = {
        // Move your book parsing logic to here and construct the new Book instance.
    }

}

然后在您的控制器功能中,您将执行以下操作:

import play.api.libs.json._

val rawText: String = ... // The raw text you're parsing the book data from.
val book: Book = Book.parse(rawText) // The parsed Book
val json: JsValue = Json.toJson(book) // The Book as a Play JSON object (can be returned as a JSON response)
val jsonString: String = Json.stringify(json) // The Book JSON as a String object, in case you need that..

这比它需要的更冗长,但我逐行将它分开来说明每一步发生了什么。如果您想要的只是JSON作为字符串Jsons.stringify(Json.toJson(Book.parse(rawText)))就足够了。

现在Book逻辑是自包含的,而不会混淆另一个对象。