Локальные параметры конструктора класса Scala

могу ли я передать аргументы конструктору класса Scala, которые не хранятся в самом классе? Я хочу достичь функциональности, которая в Java может быть написана следующим образом:

class A {
    private final SomethingElse y;
    public A(Something x) {
          y = x.derive(this);
    }
}

т. е. конструктор класса принимает параметр, который позже преобразуется в другое значение, используя ссылку на this. Параметр забывается после возвращения конструктора.

в Scala я могу сделать:

class A(x: Something) {
    val y = x.derive(this)
}

но это значит, что x хранится в классе, который я хочу избегать. С x.derive метод использует ссылку на this, Я не могу сделать преобразование в объект-компаньон.

1 ответов


но это означает, что x хранится в классе, которого я хочу избежать.

если вы не ссылаетесь на аргумент конструктора нигде, кроме самого конструктора, поле не будет создано. Если вы ссылаетесь x например toString(), Scala автоматически создаст и назначит private val для вас.

использовать javap -c -private A чтобы проверить, какие поля фактически создаются.

кстати, вы передаете this внутри конструктора, что означает a.derive() получает ссылку на, возможно, неинициализированный экземпляр A. Будьте осторожны!