Scala对象构造函数

时间:2019-01-29 17:28:19

标签: scala

我必须创建一个文件加载器对象,并且我希望在对象创建时仅将文件加载一次。
到目前为止,我所做的是使用方法read创建特征,该方法将读取文件并输出String列表。

trait Loader {
  protected val readSource: List[String] = {
    Source
      .fromInputStream(getClass.getResourceAsStream("filename"), "UTF-8")
      .getLines()
      .toList
  }

  def transform(delimeter: String): Vector[C] = {
    val lines = readSource
    // process the lines
  }
}

特征由多个对象实现,并且可以在客户端代码中多次调用transform方法。

我想避免每次调用transform方法时都重新读取文件,而我的第一个解决方案是从transform方法中提取val lines = readSource并对其进行函数def loadFile = readSource并创建在我的对象中应用apply方法来调用loadFile,就像这样:

object MyLoader extends Loader {
  def apply: List[String] = {
    loadFile
  }
}

我想知道这是否是正确的方法。谢谢您的建议。

1 个答案:

答案 0 :(得分:0)

如果您希望资源全部读取一次,则应该在一个单例对象中进行此操作,该对象将被延迟一次初始化。

客户应使用该对象。 “优先选择组成而不是继承”是我们的口头禅。

如果您希望使用一种易于使用该对象的混合方式,则可以使用“自我类型”来约束客户端:

trait HasResource { val resource: R = TheResource }
trait Client { self: HasResource => def getR: R = resource }

这是使事物可用的“蛋糕模式”方法。