gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:38:57 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com