Каков хороший способ обработки унитизированных закрытых элементов в объектах Scala? - PullRequest
0 голосов
/ 18 октября 2019

Кажется, что неинициализированные члены в теле объекта запрещены в объектах Scala .. Я хотел сделать что-то вроде (если это было в Java)

class MyClass {
  private String str;

  private String reassignString(String value) {
     str = value;
  }

Я ограничен в изменении этого кодаот объекта к классу (поскольку этот репо используется многими командами) - какой хороший способ Scala справиться с такой ситуацией? Извините, вопрос действительно расплывчатый.

Ответы [ 4 ]

1 голос
/ 18 октября 2019

Вот еще одна плохая идея:

object Lazy {
  lazy val v = if (underlying ne null) underlying else ???
  var underlying: String = null
}
Try(Lazy.v)
Lazy.underlying = "yes"
Try(Lazy.v)
Lazy.underlying = null
Try(Lazy.v)

Дело в том, что ленивый val получает более одного выстрела при инициализации, но успешно инициализируется только один раз, если вы этого хотите.

Обратите внимание, что синтаксис инициализатора по умолчанию находится на выходе. Они хотят, чтобы вы написали null, если хотите null.

Мой предпочтительный инициализатор по умолчанию:

var underlying: String = underlying

, просто чтобы сломать лед на званых обедах.

1 голос
/ 18 октября 2019

Неинициализированные значения - плохая идея, поэтому str необходимо инициализировать до действительного значения.

Существует три очевидных варианта:

Задать str значение по умолчанию

private var str: String = _

Выберите свое значение по умолчанию

private var str: String = "undefined"

Использование Option

class MyClass {
  private var str: Option[String] = None

  private def reassignString(value: String): Unit = {
    str = Some(value)
  }
}
0 голосов
/ 18 октября 2019

str в этом Java-коде инициализируется до null. Scala просто требует, чтобы вы четко указали, хотите ли вы этого.

0 голосов
/ 18 октября 2019

Рассмотрим инициализатор по умолчанию подчеркивание _ синтаксис, который мы также можем использовать в одиночных объектах , например,

object MyObject {
  private var _str: String = _

  def str_=(value: String): Unit = this._str = value
  def str: String = this._str
}

MyObject.str = "42"
MyObject.str // outputs res0: String = 42

Обратите внимание, что значение по умолчанию для Stringбудет null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...