ciu*_*can 10 constructor scala
以下代码摘自Martin Odersky等人的Scala编程书.它定义了一个理性类型:
class Rational(n: Int, d: Int) {
require(d != 0)
private val g = gcd(n.abs, d.abs)
val numer = n / g
val denom = d / g
...
private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
}
Run Code Online (Sandbox Code Playgroud)
这里值g仅在隐式构造函数初始化字段numer和denom时使用.假设程序员知道它不会在其他任何地方使用.在上面的例子中,它在构造Rational对象后仍然可以访问.这意味着它也将占用空间,因为它是一个私有字段,而不是构造函数的局部变量.
我的问题是如何更改此代码,以便g仅在构造时使用然后丢弃?
Jea*_*let 10
在这种情况下,这样的事情怎么样?
class Rational(n: Int, d: Int) {
require(d != 0)
val (numer, denom) = {
val g = gcd(n.abs, d.abs)
(n / g, d / g)
}
private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
}
Run Code Online (Sandbox Code Playgroud)
编辑:这也创建了一个包含元组的额外字段,如javap在编译的类上运行所示(谢谢,Alexey):
public class Rational extends java.lang.Object implements scala.ScalaObject{
private final scala.Tuple2 x$1; // actually unwanted!
private final int numer;
private final int denom;
public int numer();
public int denom();
private int gcd(int, int);
public Rational(int, int);
}
Run Code Online (Sandbox Code Playgroud)
在其他情况下,我有时会使用locally块来避免将每个块val转换为字段:
class A {
locally {
val value1 = // ...
val value2 = // ...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
410 次 |
| 最近记录: |