在Scala中加载类的最佳实践

时间:2014-02-22 16:00:19

标签: scala

我是Scala(以及函数式编程)的新手,我正在开发一个基于插件的应用程序来学习和学习。 我已经成为一个插件接口的特征了。因此,当我的应用程序启动时,它将加载实现此特征的所有类。

trait Plugin {
  def init(config: Properties)
  def execute(parameters: Map[String, Array[String]])
}

在我学习Scala的过程中,我读到如果我想以功能方式编程,我应该避免使用var。这是我的问题: 在加载类之后将调用init方法。可能我想在execute方法中使用config参数中的值。 如何在不使用var的情况下存储它?在这里做我想要的更好的做法吗? 感谢

2 个答案:

答案 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