scala - 如何存储方法 vals 而不是在每次方法调用时都重新创建它们

标签 scala

我有 Scala 类,它的方法使用了很多正则表达式。每个类方法都使用一些正则表达式模式。 从代码模块化的角度来看,我应该将这些模式存储在方法中:

class Bar {
    def foo() {
        val patt1 = "[ab]+".r
        val patt2 = "[cd]+".r
        /*...*/
    }
}

但是这种方法效率很低。在每次方法调用时都会重新编译模式。 我可以将它们直接移到类里面:

class Bar {
    val fooPatt1 = "[ab]+".r
    val fooPatt2 = "[cd]+".r
    /*...*/
}

但如果我有 30 个方法,它看起来很难看。

我最终得到了一些使用 val 和匿名函数的混合解决方案:

val z = {
    val patt1 = "[ab]+".r
    val patt2 = "[cd]+".r
    () => { /* ... */ }
}

但我不确定与 def 相比,使用 val 存储函数是否有一些缺点。也许有其他干净的解决方案来存储方法常量而不污染类?

最佳答案

使用 val 非常好。可能会有(非常)小的性能影响,但在大多数 (99.9%) 应用程序中这不是问题。

你也可以为这个方法创建一个类

// The extends is not needed, although you might want to hide the Foo type
class Foo extends (() => ...) {
  val patt1 = "[ab]+".r
  val patt2 = "[cd]+".r

  def apply() = {
    ...
  }
}

然后在类里面:

class Bar {
  val foo = new Foo
}

另一种解决方案是使用特征

trait Foo {
  private lazy val patt1 = "[ab]+".r
  private lazy val patt2 = "[cd]+".r

  def foo() = ...
}

class Bar extends Foo with ...

请注意,如果您在单个类中有不同的方法,则可能表明违反了单一职责原则。将它们移至它们自己的类(或特征)也可以解决该问题。

关于scala - 如何存储方法 vals 而不是在每次方法调用时都重新创建它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26833737/

相关文章:

scala - 将 foreach 变量传递给 Spark sql 以在 Spark 中计算总和

scala - Scalatra 中的 JSONWebTokens

scala - 在 scala 中,是否可以从 TypeTag 初始化单例对象?

syntax - java代码中的Scala : $colon

Scala Slick,将 Unicode 插入数据库时​​出现问题

scala - 用于编码/解码 arity 0 的密封特征实例的 Circe 实例?

scala - Any to Function 的隐式 def 将 apply 方法添加到类

scala - 为什么以及何时需要在方法名称后面加上 _?

scala - 相当于 sbt 中的 scalac -print?

scala - scala中不同路径依赖类型的特点