令人尴尬的基本-初始化类中的字段为null-Scala

令人尴尬的基本-初始化类中的字段为null-Scala,scala,Scala,为了学习Scala,我正在转换一个小型Java项目 我有这样一个bean类。我们的目标是有两个领域和获得者和二传者来配合它。对于数字或字符串,我知道我们可以用“0”或空字符串初始化它。然而,对于类,我不知道用什么来初始化它。我知道null在Scala中是不受欢迎的 class CoreSearchPageResultS extends Serializable { var wikiHits: SearchResult[WikiSearchHit]=null var webHits: S

为了学习Scala,我正在转换一个小型Java项目

我有这样一个bean类。我们的目标是有两个领域和获得者和二传者来配合它。对于数字或
字符串
,我知道我们可以用“0”或空字符串初始化它。然而,对于类,我不知道用什么来初始化它。我知道
null
在Scala中是不受欢迎的

class CoreSearchPageResultS extends Serializable {

  var wikiHits: SearchResult[WikiSearchHit]=null
  var webHits: SearchResult[WebSearchHit]=null


}
相反,我应该这样初始化它吗

var wikiHits: SearchResult[WikiSearchHit]=new SearchResult[WikiSearchHit]();
var webHits: SearchResult[WebSearchHit]=new SearchResult[WebSearchHit]();
我理解这意味着当构造函数完成时,对象已经被构造,这是不必要的

我尝试了以下方法,但出现编译错误

private var _wikiHits: SearchResult[WikiSearchHit]

def wikiHits:SearchResult[WikiSearchHit]=_wikiHits
def wikiHits_(wikiHits:SearchResult[WikiSearchHit])=_wikiHits=wikiHits
错误:

*类CoreSearchPageResultS需要是抽象的,因为未定义变量_wikiHits [错误](请注意,需要初始化变量才能定义)*

我知道我在做一些非常愚蠢和尴尬的事情。请帮忙

我知道
null
在Scala中是不受欢迎的

的确如此
null
实际上只存在于与Java的互操作性中;不要将其用于本机Scala代码

使用
选项
代替具有可选值的内容
Option
有两个具体的子类,
Some
None
。例如:

var wikiHits: Option[SearchResult[WikiSearchHit]] = None
稍后:

wikiHits = Some(getSearchResult())
然后,您可以进行模式匹配,或使用
进行理解,或使用
选项上的其他方法:

wikiHits match {
  case Some(result) => println("Result: " + result)
  case None => println("No result!")
}

这取决于您的用例,但是延迟初始化的lazy val远比作为选项键入的可变变量更习惯于Scala:

lazy val wikiHits:SearchResult[WikiSearchHit]=getSearchResult(输入)


只有在第一次访问wikiHits时才会调用getSearchResult。如果搜索可能不返回任何结果,您可能仍然希望将wikiHits作为一个选项。

仅供参考,我也是一名Java难民。不久前,当我了解了
选项
类型后,我写了一篇关于这一点的博文:就我个人而言,我会对字符串和int(它们是scala中的纯对象,而不是原语)使用相同的方法。它可以防止您在以后发现您认为对初始化来说是良性的非值,实际上对某人意味着什么时感到心痛和头痛。。。