我有 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/