在Scala对象中处理统一私有成员的好方法是什么?

时间:2019-10-17 21:33:49

标签: scala oop

似乎在Scala对象中禁止在对象主体中包含未初始化的成员。 我想做类似的事情(如果是在Java中)

class MyClass {
  private String str;

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

我受限制在将代码从对象更改为类的情况下(因为许多团队都使用此仓库)-处理这种情况的一种好的Scala方法是什么?抱歉,这个问题真的很模糊。

4 个答案:

答案 0 :(得分:1)

未初始化的值是个坏主意,因此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)
  }
}

答案 1 :(得分:1)

这是另一个坏主意:

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

只是为了在晚宴上打破僵局。

答案 2 :(得分:0)

考虑default initialiser下划线raw_html = '<html><head><meta charset="utf-8" />' raw_html += '<script src="https://cdn.plot.ly/plotly-latest.min.js"></script></head>' raw_html += '<body>' raw_html += po.plot(fig, include_plotlyjs=False, output_type='div') raw_html += '</body></html>' fig_view = QWebView() fig_view.setHtml(raw_html) self.dialog_graphViewer.verticalLayout.addWidget(fig_view) fig_view.show() fig_view.raise_() 的语法,我们也可以像这样在单例objects中使用

_

请注意,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

答案 3 :(得分:0)

此Java代码is initialized, to null中的

str。 Scala只是要求您明确表明这是否是您想要的。