我必须创建一个文件加载器对象,并且我希望在对象创建时仅将文件加载一次。
到目前为止,我所做的是使用方法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
}
}
我想知道这是否是正确的方法。谢谢您的建议。
答案 0 :(得分:0)
如果您希望资源全部读取一次,则应该在一个单例对象中进行此操作,该对象将被延迟一次初始化。
客户应使用该对象。 “优先选择组成而不是继承”是我们的口头禅。
如果您希望使用一种易于使用该对象的混合方式,则可以使用“自我类型”来约束客户端:
trait HasResource { val resource: R = TheResource }
trait Client { self: HasResource => def getR: R = resource }
这是使事物可用的“蛋糕模式”方法。