Конструктор с неэкземплярной переменной-помощником? - PullRequest
2 голосов
/ 22 мая 2010

У меня есть несколько классов, которые выглядят так:

class Foo(val:BasicData) extends Bar(val) {
    val helper = new Helper(val)
    val derived1 = helper.getDerived1Value()
    val derived2 = helper.getDerived2Value()
}

... за исключением того, что я не хочу удерживать экземпляр "помощника" за концом конструктора.В Java я бы сделал что-то вроде этого:

public class Foo {
  final Derived derived1, derived2;
  public Foo(BasicData val) {
     super(val);
     Helper helper = new Helper(val);
     derived1 = helper.getDerived1Value();
     derived2 = helper.getDerived2Value();
  }
}

Так как мне сделать что-то подобное в Scala?Мне известно о создании вспомогательного объекта с тем же именем класса с помощью метода apply: я надеялся на что-то более лаконичное.

Ответы [ 2 ]

5 голосов
/ 22 мая 2010

Вы можете использовать блок для создания временного вспомогательного значения и возврата кортежа, например:

class Foo(v: BasicData) extends Bar(v) {
  val (derived1, derived2) = {
    val helper = new Helper(v)
    (helper.getDerived1Value(), helper.getDerived2Value())
  }
}
4 голосов
/ 22 мая 2010

Лучше взгляните на вывод javap (включая закрытые члены), прежде чем сделать вывод, что он обошел все поля для Tuple2, используемого в промежуточном сопоставлении с образцом.

Начиная с Scala 2.8.0.RC2, этот код Scala (выделен для компиляции):

class BasicData
{
  def basic1: Int = 23
  def basic2: String = "boo!"
}

class Helper(v: BasicData)
{
  def derived1: Int = v.basic1 + 19
  def derived2: String = v.basic2 * 2
}

class Bar(val v: BasicData)

class   Foo(v: BasicData)
extends Bar(v)
{
  val (derived1, derived2) = {
    val helper = new Helper(v)
    (helper.derived1, helper.derived2)
  }
}

Производит этот Foo класс:

% javap -private Foo
public class Foo extends Bar implements scala.ScalaObject{
    private final scala.Tuple2 x$1;
    private final int derived1;
    private final java.lang.String derived2;
    public int derived1();
    public java.lang.String derived2();
    public Foo(BasicData);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...