gpt4 book ai didi

scala - 避免 Scala 内存泄漏 - Scala 构造函数

转载 作者:行者123 更新时间:2023-12-03 01:39:44 26 4
gpt4 key购买 nike

我正在阅读《Scala 编程》一书,并在第 6 章中的类 Rational 实现中遇到了一些问题。

这是我的 Rational 类的初始版本(基于本书)

class Rational(numerator: Int, denominator: Int) {
require(denominator != 0)

private val g = gcd(numerator.abs, denominator.abs)

val numer = numerator / g
val denom = denominator / g

override def toString = numer + "/" + denom

private def gcd(a: Int, b: Int): Int =
if(b == 0) a else gcd(b, a % b)

// other methods go here, neither access g
}

这里的问题是字段 g 在类的生命周期中保留,即使不再被访问。通过运行以下模拟程序可以看到这个问题:

object Test extends Application {

val a = new Rational(1, 2)
val fields = a.getClass.getDeclaredFields

for(field <- fields) {
println("Field name: " + field.getName)
field.setAccessible(true)
println(field.get(a) + "\n")
}

}

它的输出将是:

Field: denom
2

Field: numer
1

Field: g
1

我在 Scala Wiki 找到的解决方案涉及以下内容:

class Rational(numerator: Int, denominator: Int) {
require(denominator != 0)

val (numer, denom) = {
val g = gcd(numerator.abs, denominator.abs)
(numerator / g, denominator / g)
}

override def toString = numer + "/" + denom

private def gcd(a: Int, b: Int): Int =
if(b == 0) a else gcd(b, a % b)

// other methods go here
}

这里,字段 g 仅位于其 block 的本地,但是,运行小型测试应用程序,我发现另一个字段 x$1 ,它保留由 (numer ,分母)!

Field: denom
2

Field: numer
1

Field: x$1
(1,2)

有没有办法用上面的算法在Scala中构造一个有理数,而不会导致任何内存泄漏?

谢谢

弗拉维乌·西普西甘

最佳答案

伴随对象可以提供您所需的灵 active 。它可以定义一个“静态”工厂方法来替换构造函数。

object Rational{

def apply(numerator: Int, denominator: Int) = {
def gcd(a: Int, b: Int): Int = if(b == 0) a else gcd(b, a % b)
val g = gcd(numerator, denominator)
new Rational(numerator / g, denominator / g)
}
}

class Rational(numerator: Int, denominator: Int) {
require(denominator != 0)

override def toString = numerator + "/" + denominator
// other methods go here, neither access g
}

val r = Rational(10,200)

在工厂方法 g 的范围内,可以计算并使用 g 来导出两个构造函数值。

关于scala - 避免 Scala 内存泄漏 - Scala 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1218872/

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