我是Scala(以及函数式编程)的新手,我正在开发一个基于插件的应用程序来学习和学习。 我已经成为一个插件接口的特征了。因此,当我的应用程序启动时,它将加载实现此特征的所有类。
trait Plugin {
def init(config: Properties)
def execute(parameters: Map[String, Array[String]])
}
在我学习Scala的过程中,我读到如果我想以功能方式编程,我应该避免使用var。这是我的问题: 在加载类之后将调用init方法。可能我想在execute方法中使用config参数中的值。 如何在不使用var的情况下存储它?在这里做我想要的更好的做法吗? 感谢
答案 0 :(得分:3)
除了避免变量之外,还有更多的功能性编程方式。一个关键概念也是偏好不可变对象。在这方面,你的插件API已经打破了功能原则,因为这两种方法只针对它们的副作用执行。使用这样的API在实现中使用vars并没有什么区别。
对于不可变的插件实例,您可以拆分插件创建:
trait PluginFactory {
def createPlugin (config: Properties): Plugin
}
trait Plugin {
def execute ...
}
示例:
class MyPluginFactory extends MyPlugin {
def createPlugin (config: Properties): Plugin = {
val someValue = ... // extract from config
new MyPlugin(someValue)
}
}
class MyPlugin (someValue: String) extends Plugin {
def execute ... // using someConfig
}
答案 1 :(得分:2)
您可以使用val
!它基本上是相同的,但以后不能修改val
字段的值。如果你正在使用一个类,你可以写:
例如:
class Plugin(val config: Properties) {
def init {
// do init stuff...
}
def execute = // ...
}
不幸的是,trait
不能有类参数。如果您希望在特征中包含config
字段,则无法立即设置其值,因此必须为var
。