В таком случае, как насчет чего-то подобного?
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)
}
РЕДАКТИРОВАТЬ: Это также создает дополнительное поле, которое содержит кортеж, как показано при запуске javap
в скомпилированном классе (спасибо, Алексей):
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);
}
В других случаях я иногда использую блок locally
, чтобы не превращать каждый val
в поле:
class A {
locally {
val value1 = // ...
val value2 = // ...
}
}